Java7中的集合中间操作库

时间:2014-12-12 17:08:41

标签: collections java-8 java-7 guava apache-commons-collection

我喜欢intermediate operations Java8的想法,当达到terminal operation时,所有操作都会应用一次。

我在问是否有可以与Java 7一起使用的库,可以让我实现这样的行为。

注意:
我正在使用commons-collections4进行收集操作,例如forAllDo,那么可以将它用于这种情况吗? (中间与终端运营)

1 个答案:

答案 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的样式进行编码。


Goldman Sachs Collections

虽然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
}

突然输出一切。