【问题标题】:I use Guava's immutable collections (compiled for Java 6) and a Java 8 JRE, can I use the new stream interface?我使用 Guava 的不可变集合(为 Java 6 编译)和 Java 8 JRE,我可以使用新的流接口吗?
【发布时间】:2014-05-04 19:29:35
【问题描述】:

我使用 Guava,尤其是它们的不可变集合(ImmutableListImmutableSet)。

但是 Guava 是为 Java 6 编译的。如果我使用 Java 8,我可以用 .stream() 和它们一起使用吗?

【问题讨论】:

    标签: java collections guava java-8


    【解决方案1】:

    是的,你可以。

    .stream() 方法,在Collection 接口has a default implementation 中定义。就此而言,.parallelStream().spliterator() 也是如此。 Lists 和 Sets “都是”Collections。

    它并没有就此结束,因为您也可以在 Guava 的 ImmutableMaps 上使用 Map's .forEach()Map 确实有其他默认操作,但是它们会改变地图,而 Guava 的不可变集合/地图是……嗯……

    请注意,更一般地,每次接口的方法都有一个默认实现,它会在 javadoc 中被提及,因为方法的返回类型会以 default 关键字开头

    一些示例,非常粗糙的代码可以工作并利用它(以及 lambdas 中使用的单一抽象方法的概念,请参阅here 了解更多详细信息):

    ImmutableSet.of(23, 2389, 19).stream().forEach(System.out::println);
    

    System.outPrintStream,其.println() method签名与Consumer相同)

    【讨论】:

      【解决方案2】:

      由于ImmutableList实现了CollectionIterable,这两个接口是Java 8提供的接口,对于你列举的方法都有默认实现,所以你给出的答案并不意外吧?

      也许问题应该重新表述为:ImmutableList 是否实现了CollectionIterable?因为如果是这样,Java 8 提供的所有默认方法都可以使用。特别是:.stream().parallelStream().spliterator()

      但是答案只需要查找Guava 提供的JavaDoc,这也没什么大不了的。

      【讨论】:

      • 对不起,我完全不明白你的意思。 Collection.stream() 的默认方法是不是很明显?不。在我检查之前我什至不知道。
      • 更重要的是,这是对接口中default 真正能为您做的事情的一次很好的尝试;我敢肯定,到时候,Google 会用一个自定义的实现覆盖这个实现,这对于这些特定的Collections 来说更快。
      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2017-07-03
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多