在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可以具有所需的任意多个中间操作,但只能有一个终端操作。

07-28 13:15