使用java流将两个集合的元素与分隔符连接起来

时间:2015-09-27 18:00:09

标签: java java-8 guava java-stream

我有两套说:

ImmutableSet<String> firstSet = ImmutableSet.of("1","2","3");
ImmutableSet<String> secondSet = ImmutableSet.of("a","b","c");

我想得到一个集合,其中包含第一个集合的元素与第二个元素的每个元素连接在一起,以及一个分隔符,即输出应该是:

ImmutableSet<String> thirdSet = ImmutableSet.of("1.a","1.b","1.c","2.a","2.b","2.c","2.c","3.a","3.b","3.c");

(这里“。”是我的分隔符)

我最初认为我可以通过流式传输第一套并在第二套元素上应用Collectors.joining()来做到这一点,但这不能解决我的需要。

2 个答案:

答案 0 :(得分:4)

  

我最初认为我可以通过流式传输来实现这一目标   首先在。的元素上设置并应用Collectors.joining()   第二,但这不能解决我的需求。

你可以做的是流动第一组,并用第二组的所有元素平面映射每个元素。

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toSet;

...

ImmutableSet<String> thirdSet = 
    firstSet.stream()
            .flatMap(s1 -> secondSet.stream().map(s2 -> s1+"."+s2))
            .collect(collectingAndThen(toSet(), ImmutableSet::copyOf));

如果您想直接收集到ImmutableSet,可以使用ImmutableSet构建器创建自定义收藏夹(另请参阅How can I collect a Java 8 stream into a Guava ImmutableCollection?)。

答案 1 :(得分:3)

好像你正在使用番石榴。在这种情况下,您只需使用Sets.cartesianProduct方法

即可
Set<List<String>> cartesianProduct = Sets.cartesianProduct(firstSet,secondSet);
for (List<String> pairs : cartesianProduct) {
    System.out.println(pairs.get(0) + "." + pairs.get(1));
}

输出:

1.a
1.b
1.c
2.a
2.b
2.c
3.a
3.b
3.c

如果您想在ImmutableSet<String>收集它,可以使用

ImmutableSet<String> product = ImmutableSet.copyOf(
        cartesianProduct.stream()
                        .map(pairs -> pairs.get(0) + "." + pairs.get(1))
                        .toArray(String[]::new)
);