【问题标题】:How methods of stream interface work in java?流接口的方法在java中是如何工作的?
【发布时间】:2017-05-28 12:28:19
【问题描述】:

最近我在学习 Java 8 的特性,所以我从一个 lambda 表达式开始,然后我遇到了 Java 流 API,现在我正试图围绕流 API 中的方法,它们是如何工作的?

我对 lambda 表达式的理解是,如果我们想将 lambda 表达式传递给方法,那么我们需要使用与 lambda 表达式的签名匹配的单个未实现方法(Java 8 接口可以具有默认实现)创建一个接口.那么lambda表达式被传递到的方法可以通过调用接口方法来执行lambda表达式。所以我可以说 lambda 表达式作为接口方法的实现。

但是当我看到 Stream API 时,它有一些改变流的方法,例如下面的代码只是通过过滤小于 5 的整数来打印整数。

import java.util.Arrays;
import java.util.List;


public class StreamDemo {
   static List<Integer> list= Arrays.asList(new Integer(1), new Integer(2), new Integer(3), new Integer(4), new Integer(5), new Integer(6));
    public static void main(String[] ar) {
        list.parallelStream()
                .filter( x-> x<5)
                .forEach(System.out::print);
    }
}

但我不明白,过滤器是如何工作的,因为它没有实现,我试图从 Intellij 中查看实现,它将我带到 Stream 接口,其中过滤器是非实现方法,它采用参数 Predicate 引用,但是没有谓词方法boolean test(T t);的方法调用那么Java如何评估结果,同样有方法distinct没有实现但仍然给我准确的结果。

提前致谢。

【问题讨论】:

  • filter 确实有一个实现,在这种情况下,它由parallelStream() 返回的Stream 实例提供。您可以通过单击定义旁边空白处的绿色小箭头找到接口方法的所有实现。
  • 感谢您的快速提示,但我无法导航到不同的方法定义
  • @AkshayNaik 你不需要知道哪个类实现了这个方法,以及它是如何实现的。您只需要知道一个 Stream,无论它的具体实现是什么,都有一个 distinct() 方法,该方法的工作原理与 Stream 接口的 javadoc 中的文档一样。

标签: java intellij-idea lambda java-8 java-stream


【解决方案1】:

Stream 只是一个接口,就像List。 在运行时,Java 会选择一个完成这项工作的实现。 如果你想知道 filter 方法是如何实现的,java.util.stream.ReferencePipeline#filter 中有一个例子。

我希望这能回答你的问题。

【讨论】:

  • 感谢您的准确回答,但仍然给我留下了两个问题。 1. 由于stream是由ReferencePipeline实现的,如何在不向下转换的情况下调用filter方法 2. ReferencePipeline没有distinct方法的实现
  • 好的,现在明白了,stream方法给出了ReferencePipeline的对象,由于方法是stream接口的,所以不需要向下转换对象。谢谢@jdebon
猜你喜欢
  • 2014-09-23
  • 2011-10-20
  • 2020-07-30
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2019-09-22
相关资源
最近更新 更多