我喜欢intermediate operations
Java8
的想法,当达到terminal operation
时,所有操作都会应用一次。
我在问是否有可以与Java 7
一起使用的库,可以让我实现这样的行为。
注意:
我正在使用commons-collections4
进行收集操作,例如forAllDo,那么可以将它用于这种情况吗? (中间与终端运营)
答案 0 :(得分:9)
正如您的[Guava]标签所示,大多数Guava收集操作都是懒惰的 - 只有在需要时才会应用它们。例如:
List<String> strings = Lists.newArrayList("1", "2", "3");
List<Integer> integers = Lists.transform(strings, new Function<String, Integer>() {
@Override
public Integer apply(String input) {
System.out.println(input);
return Integer.valueOf(input);
}
});
此代码似乎将List<String>
转换为List<Integer>
,同时还将字符串写入输出。但如果你实际运行它,它什么都不做。让我们再添加一些代码:
for (Integer i : integers) {
// nothing to do
}
现在它将输入写出来了!
那是因为Lists.transform()
方法实际上并没有进行转换,而是返回一个特制的类,它只在需要时计算值。
奖励证明这一切都很好用:如果我们删除了空循环并将其替换为例如仅integers.get(1);
,它实际上只会输出数字2
。
如果您想将多种方法链接在一起,则总是FluentIterable
。这基本上允许您使用类似Java 8 Stream的样式进行编码。
虽然Guava默认情况下通常做正确的事情并且与JDK类一起使用,但有时候你需要更复杂的东西。这就是高盛集合的收藏品.GS系列通过提供完整的嵌入式收藏框架,为您提供更多的灵活性和强大功能。懒惰不是默认的,但可以轻松实现:
FastList<String> strings = FastList.newListWith("1", "2", "3");
LazyIterable<Integer> integers = strings.asLazy().collect(new Function<String, Integer>() {
@Override
public Integer valueOf(String string) {
System.out.println(string);
return Integer.valueOf(string);
}
});
再一次,没有做任何事情。但是:
for (Integer i : integers) {
// nothing to do
}
突然输出一切。