【发布时间】:2014-05-04 19:29:35
【问题描述】:
我使用 Guava,尤其是它们的不可变集合(ImmutableList、ImmutableSet)。
但是 Guava 是为 Java 6 编译的。如果我使用 Java 8,我可以用 .stream() 和它们一起使用吗?
【问题讨论】:
标签: java collections guava java-8
我使用 Guava,尤其是它们的不可变集合(ImmutableList、ImmutableSet)。
但是 Guava 是为 Java 6 编译的。如果我使用 Java 8,我可以用 .stream() 和它们一起使用吗?
【问题讨论】:
标签: java collections guava java-8
是的,你可以。
.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.out是PrintStream,其.println() method签名与Consumer相同)
【讨论】:
由于ImmutableList实现了Collection和Iterable,这两个接口是Java 8提供的接口,对于你列举的方法都有默认实现,所以你给出的答案并不意外吧?
也许问题应该重新表述为:ImmutableList 是否实现了Collection 和Iterable?因为如果是这样,Java 8 提供的所有默认方法都可以使用。特别是:.stream()、.parallelStream() 和 .spliterator()。
但是答案只需要查找Guava 提供的JavaDoc,这也没什么大不了的。
【讨论】:
Collection 有 .stream() 的默认方法是不是很明显?不。在我检查之前我什至不知道。
default 真正能为您做的事情的一次很好的尝试;我敢肯定,到时候,Google 会用一个自定义的实现覆盖这个实现,这对于这些特定的Collections 来说更快。