html制作网站的步骤,电子商务网站建设与维护方法,深圳企业注销,大学生做爰网站java streams对于刚接触JDK 8的管道和流的Java开发人员而言#xff0c; Stream接口提供的peek#xff08;Consumer#xff09;方法可以是有用的工具#xff0c;有助于可视化流操作的行为。 即使是更熟悉Java流和聚合操作的Java开发人员#xff0c;有时也会发现Stream.peek… java streams 对于刚接触JDK 8的管道和流的Java开发人员而言 Stream接口提供的peekConsumer方法可以是有用的工具有助于可视化流操作的行为。 即使是更熟悉Java流和聚合操作的Java开发人员有时也会发现Stream.peekConsumer对于理解复杂的中间流操作的含义和交互作用很有用。 Stream.peekConsumer方法需要使用Consumer 它实际上是一个接受单个参数却不返回任何内容的代码块。 peek(Consumer)方法返回传递给它的流的相同元素因此除非传递给peek(Consumer)方法的代码块使流中的对象发生突变否则流的内容将不会更改。 。 Stream.peek(Consumer)的绝大多数用途可能是在调用该方法时以只读方式打印流中对象的内容。 Stream.peekConsumer的基于Javadoc的API文档更加详细地说明了此方法的行为并提供了其用法示例。 该示例在下面的代码清单中略作修改 final ListString strings Stream.of(one, two, three, four).peek(e- out.println(Original Element: e)).filter(e - e.length() 3).peek(e - out.println(Filtered value: e)).map(String::toUpperCase).peek(e - out.println(Mapped value: e)).collect(Collectors.toList());
out.println(Final Results: strings); 执行上述代码后其关联的输出如下所示 Original Element: one
Original Element: two
Original Element: three
Filtered value: three
Mapped value: THREE
Original Element: four
Filtered value: four
Mapped value: FOUR
Final Results: [THREE, FOUR] 输出通过提供给它们的元素讲述了流操作的故事。 首次执行中间peek操作将使用前缀“原始元素”将原始流中的每个元素写到系统输出中。 对于每个原始String不会执行稍后发生的中间peek操作的实例因为这些peek操作中的每一个都至少在进行一次过滤之后发生。 启用peek输出还清楚地显示了在每个String元素上以等效的大写形式执行中间操作映射的结果。 收集操作是终止操作因此此后不进行任何peek 。 peek操作的战略位置可让您深入了解正在发生的流处理。 用于Stream.peekConsumer的Javadoc指出“存在此方法主要是为了支持调试您需要在其中查看元素流过管道中特定点的情况。” 这正是上面显示的示例和输出所演示的并且可能是Stream.peek(Consumer)的最常见应用。 Stream.peekConsumer的Javadoc文档以以下描述性句子开头“返回由该流的元素组成的流并在从结果流中消耗掉元素时对每个元素执行附加的操作。” 在前面的示例中在消耗每个元素时对每个元素执行的操作只是将其字符串表示形式写入标准输出。 但是采取的操作可以是可以指定为Consumer任何内容任何接受单个参数且不返回任何参数的代码块。 下一个示例演示如何甚至可以使用peek(Consumer)更改流上对象的内容。 在本文的第一个示例中 peek(Consumer)无法更改流元素因为这些元素是不可变的Java String 。 然而如果流元件是可变的则Consumer传递给peek(Consumer)可以改变这些元素的含量。 为了说明这一点我将使用MutablePerson显示的简单类MutablePerson 。 MutablePerson.java package dustin.examples.jdk8.streams;/*** Represents person whose name can be changed.*/
public class MutablePerson
{private String name;public MutablePerson(final String newName){name newName;}public String getName(){return name;}public void setName(final String newName){name newName;}Overridepublic String toString(){return name;}
} 下一个代码清单显示了当该流中的元素可变时 Stream.peek(Consumer)如何更改该流操作的结果。 final ListMutablePerson people Stream.of(new MutablePerson(Fred),new MutablePerson(Wilma),new MutablePerson(Barney),new MutablePerson(Betty)).peek(person - out.println(person)).peek(person - person.setName(person.getName().toUpperCase())).collect(Collectors.toList());
out.println(People: people); 执行上述代码后它会产生如下输出 Fred
Wilma
Barney
Betty
People: [FRED, WILMA, BARNEY, BETTY] 此示例表明传递给peek的Consumer确实将人民姓名的大小写更改为大写。 这仅是可能的因为正在处理的对象是可变的。 有人认为使用peek更改流中的元素可能是一种反模式 我发现自己对此方法感到不舒服但我通常也不喜欢将方法的参数设为“ 输出参数 ”。 peek方法的名称peek一个人只是看而不是触摸但是它接受的Consumer参数则宣告可以更改某些内容 Consumer的Javadoc指出“与大多数其他功能接口不同Consumer应该通过副作用来操作” 。 博客文章“ 使用Java Stream API进行Stream.peek(Consumer) ”讨论了使用Stream.peek(Consumer)和变异操作相关的潜在问题。 Steam.peek(Consumer)是用于了解流操作如何影响元素的有用工具。 翻译自: https://www.javacodegeeks.com/2018/06/peeking-inside-java-streams.htmljava streams