【问题标题】:Implementation of Collection.stream()Collection.stream() 的实现
【发布时间】:2017-05-30 09:53:42
【问题描述】:

我已经在 J​​DK 1.8 上工作了几天,我遇到了一些与此类似的代码:

List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream();

现在,对于一直使用流 (java.util.stream) 的人来说,这可能看起来简单而干净,但我找不到实现 java.util.Collection.stream() 方法的实际类。

当我说list.stream()时,我有以下问题:

  1. 我从哪里获得java.util.stream.Stream
  2. 他们是如何在不实际“干扰”现有集合的情况下实现它的?(假设他们没有接触它们

我确实尝试过查看java.util.AbstractCollectionjava.util.AbstractList 的文档,但找不到。

【问题讨论】:

标签: java java-8 java-stream


【解决方案1】:

Java 8 允许在接口中定义default methods

Collection&lt;E&gt; 然后defines

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

他们就是这样添加的。

【讨论】:

  • 知道了,谢谢。我缺少的是在 JDK 1.8 的接口中引入默认方法。
  • 我很高兴获得声誉(因为我的回答是第一个),但我仍然可以认识到,从那时起其他答案已经添加了进一步的解释。
【解决方案2】:

正如其他人指出的那样,.stream() 方法在Collection 接口本身中实现为default method,正如您在official documentation 中的方法签名中看到的那样:

default Stream<E> stream()

流接口如何实现是集合的实现细节。然而,为每个集合实现同样繁重的Stream 接口将需要大量工作和重复,因此他们使用了一个名为Spliterator 的中间抽象。

This SO thread on .stream() 可能也值得一读。

【讨论】:

    【解决方案3】:

    您在ArrayList 中没有看到它,因为它在Collection 中被定义为默认方法(您可能已经知道了)。 但是它可以在ArrayList 或任何其他集合中定义,从而覆盖它。例如,它在CopiesList 中定义为:

        @Override
        public Stream<E> stream() {
            return IntStream.range(0, n).mapToObj(i -> element);
        }
    

    因此覆盖来自Collection的那个;这意味着它并不总是来自超类。

    【讨论】:

      【解决方案4】:

      这是 Collection 接口定义中的 default method(另一个 Java 8 功能)。代码见Collection.java Line 580

      default Stream<E> stream() {
         return StreamSupport.stream(spliterator(), false);
      }
      

      【讨论】:

        【解决方案5】:

        “流”只是一个名称,用于对背后的功能方面进行分组。真正的实现在java.util.stream.ReferencePipeline 类中。

        您可以在此处查看在中间操作和最终操作期间应用的代码。例如,要从 Collection 转到 Stream,您可以按照路径

        Collection::stream() -> StreamSupport::stream() -> ReferencePipeline.Head
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-05
          • 1970-01-01
          • 2014-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多