(*) forEach
和没有?之间有什么区别?什么是输出,为什么?我知道没有forEach
什么都不打印......但是为什么需要偷看呢?
正如我所知道的peek
你必须对System.out.println
的结果流做一些事情......但是它似乎没有在这里完成,它仍然运行....
public class NaturalNumbers
implements Supplier<Integer> {
private int i = 0;
public Integer get() { return ++i; }
}
public static void main(String[] args) {
Stream<Integer> s =
Stream.generate(new NaturalNumbers());
s.limit(5)
.peek( System.out::println )
.forEach( System.out::println );/// ׂ (*)
{
答案 0 :(得分:2)
peek
只是在流中 peek 的一种方式,它不会改变它,但是peek中的函数将接收流中的所有元素。
forEach
是一个终端操作,它将使用流中的所有数据并返回void
。
上述代码的结果将是每个数字打印两次,当您删除peek
时,您将只打印一次数字。
如果删除forEach
,则不会获得任何输出,因为在遇到终端操作(例如forEach
,count
)之前,流不会执行操作。
答案 1 :(得分:2)
有终端和中间操作的概念。 终端操作是最后一步 - 它们会导致所有中间操作被处理。 Peek不是终端操作。
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("Mapped value: " + e))
.collect(Collectors.toList());
是的,我建议你查看方法peek的javadocs: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
另外,请阅读本文档 https://docs.oracle.com/javase/tutorial/collections/streams/
如何知道方法是终端操作还是中间操作?很简单,因为它可以 - 中间操作总是返回Stream类,而终端操作可以返回各种不同的对象 - 可选类,一些集合,基元等。