在Java 8中,java.util.stream.Stream#forEach
可以替代传统的for循环。但是为什么不是链式函数呢?说它返回void而不是自己给自己Stream<T>
。
像这样
Arrays
.stream(Girls.toArray())
.forEach(Girls::getUp)
.forEach(Girls::dressUp)
.filter(/* Top 10 Girls */)
.forEach(Gay.getMe()::gotGirl)
.endFilter()// Not an API, but it means remove last filter
.filter(/* Worst 10 Girls */)
.forEach(Gay.get(0)::gotGirl)
girls = Arrays
.stream(Girls.toArray());
girls.forEach(g->{g.getUp();g.dressUp()});
girls.filter(/* Top 10 Girls */)
.forEach(Gay.getMe()::gotGirl);
girls.filter(/* Worst 10 Girls */)
.forEach(Gay.get(0)::gotGirl);
第一个比第二个好,但是第一个的性能更差。
那么,为什么
forEach
不可链接? 最佳答案
因为forEach是终端操作。它强制流消耗所有元素,并为每个元素调用消费者。一旦完成,流就被消耗掉了,无法重用。
Stream可以具有所需的任意多个中间操作,但只能有一个终端操作。