Stream接口抽象forEach()方法的实现位置及执行逻辑疑问
Iterable的forEach():无疑问
我了解到forEach()是Iterable接口中定义的默认方法,代码如下:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
因此当我编写如下代码时,上述默认方法会被执行:
items.forEach(item -> System.out.println(item));
Stream的forEach():疑问解答
Stream接口中的forEach()是抽象方法,声明如下:
void forEach(Consumer<? super T> action);
那编写items.stream().forEach(item -> System.out.println(item));时,会执行哪个实现?
答案是由Stream的实际实现类提供具体逻辑,日常使用中最常见的是JDK内部的ReferencePipeline类。以串行流为例,它的forEach实现会逐个遍历流中的元素,每拿到一个元素就调用你传入的Consumer的accept()方法——也就是你写的Lambda表达式,所以你的Lambda确实会被执行。
如果是并行流,实现逻辑会变成多线程分片处理元素,但最终每个元素还是会触发一次action.accept(t),你的Lambda照样会执行。本质上和Iterable的forEach逻辑类似,只是Stream的遍历是基于流管道的机制来完成的。
内容的提问来源于stack exchange,提问作者PANKAJ DUBEY
相关产品推荐
相关产品推荐

