合并两个流以创建一个新流

时间:2019-07-29 14:08:20

标签: java java-stream

我想同时执行两个流,并生成前两个的第三流,假设我有以下两个流

Stream<String> a = Stream.of("f","b","z");
Stream<String> b = Stream.of("foo","bar","baz");

我想从这两个中生成一个新的,这相当于这个

Stream<String> c = Stream.of("f:foo","b:bar","z:baz");

到目前为止,我发现的是Stream.concatStream.of

 Stream<String> result = Stream.concat(a, b); or
 Stream<String> result = Stream.of(a, b).flatMap(s -> s);

两者相互连接并在此对应

Stream.of("f","b","z","foo","bar","baz");

到目前为止,我的解决方法是将两个流的元素收集到一个列表中,并在两个列表上进行迭代以连接单个元素并将结果列表转换为流。 strem api中是否有较短的方法或现有功能可以同时在两个流上工作?

List<String> aList = a.collect(Collectors.toList());
List<String> bList = b.collect(Collectors.toList());
List<String> result = new ArrayList<>();
for(int i = 0; i< aList.size(); i++){
    result.add(aList.get(i)+":"+bList.get(i));
}
Stream<String> cc = result.stream();

2 个答案:

答案 0 :(得分:6)

此操作通常称为zip,并且在Stream API中不作为函数存在。您可能会从以下答案中看到:https://stackoverflow.com/a/23529010/4137489

该功能是在Google Guava库中实现的:

https://guava.dev/releases/23.0/api/docs/com/google/common/collect/Streams.html#zip-java.util.stream.Stream-java.util.stream.Stream-java.util.function.BiFunction-

您可以像这样使用它:

Streams.zip(a, b, (aElem, bElem) -> aElem + ":" + bElem));

答案 1 :(得分:1)

您可以使用IntStream.range()方法:

IntStream.range(0, aList.size()).mapToObj(index -> aList.get(index) + ":" + bList.get(index)).collect(Collectors.toList());