[英]Where is the implementation of the filter() method in the Stream<T> interface?
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 的元素。 Predicate 中的測試方法為我們完成了這項工作。
但是 filter() 方法的實際實現在哪里返回超過 10 的“STREAM”? 我不明白。
這個問題在某種程度上也適用於 forEach() 方法。 它如何遍歷流? 由於 filter() 和 forEach() 方法在接口流中是抽象的並且沒有實現。
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() 方法的實現。
這是源代碼的鏈接: http : //hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/stream/ReferencePipeline.java
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.