【问题标题】:Where is the implementation of the filter() method in the Stream<T> interface?Stream<T> 接口中 filter() 方法的实现在哪里?
【发布时间】:2014-10-25 23:09:48
【问题描述】:
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 中的测试方法为我们完成了这项工作。

但是,返回大于 10 的“STREAM”的 filter() 方法的实际实现在哪里?我不明白。

这个问题在某种程度上也适用于 forEach() 方法。它如何遍历流?由于 filter() 和 forEach() 方法在接口流中是抽象的,没有实现。

【问题讨论】:

    标签: java-8 abstract java-stream java


    【解决方案1】:

    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);
                    }
                };
            }
        };
    }
    

    【讨论】:

    • @WaseemSwaileh 此答案中提供的链接指向 lambda/streams 的旧原型实现。 ReferencePipeline 不是标准 Java SE 8 API 的一部分,这就是为什么您在 javadocs 或 Eclipse 中看不到它的原因。该类仍然存在,但它是一个实现私有类。
    【解决方案2】:

    抽象类 ReferencePipeline 实现了 fileter() 方法。

    源代码链接如下: http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/stream/ReferencePipeline.java

    【讨论】:

    • 如果您还可以发布一个如何使用ReferencePipeline 的示例,那将非常有帮助。否则,答案几乎没有价值
    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2020-02-03
    • 2020-06-08
    相关资源
    最近更新 更多