class App { public static void main(String[] args) { ArrayList<Integer> myList = new ArrayList<>(); myList.add(7); myList.add(18); myList.add(10); myList.add(24); myList.add(17); myList.add(5); Stream<Integer> stream = myList.stream(); stream = stream.filter(n -> n > 10); // it returns a stream of elements more than 10 stream.forEach(n -> System.out.print(n + " ")); } }
此代码过滤调用流,然后打印所有大于10的元素。谓词中的测试方法为我们做到了。
但是filter()方法的实际实现在哪里,该方法返回的“ STREAM”大于10?我不明白。
此问题在某种程度上也适用于forEach()方法。如何在流中迭代?因为filter()和forEach()方法在接口流中是抽象的,并且没有实现。
class App {public static void main(String [] args){ArrayList
[java.util.stream.ReferencePipline实现Stream<T>.filter()。
@Override
public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate) {
Objects.requireNonNull(predicate);
return new StatelessOp<P_OUT, P_OUT>(this, StreamShape.REFERENCE,
StreamOpFlag.NOT_SIZED) {
@Override
Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) {
return new Sink.ChainedReference<P_OUT, P_OUT>(sink) {
@Override
public void begin(long size) {
downstream.begin(-1);
}
@Override
public void accept(P_OUT u) {
if (predicate.test(u))
downstream.accept(u);
}
};
}
};
}
抽象类ReferencePipeline具有fileter()方法的实现。