java8中stream的提供了一个拼接流的方法Stream.concat,可以将两个stream拼接成一个stream, 保持了两个stream中的元素顺序。
那么如果我们需要对多个集合中的元素拼接成一个stream来统一处理,可以怎么做呢?
比如有三个Collection<String> c1, c2, c3.
方法一,使用Stream.concat方法来拼接,可以使用一个for循环来处理。
private static Stream<String> concat1(List<Collection<String>> collections) {
Stream result = Stream.empty();
for (Collection<String> strings : collections) {
result = Stream.concat(result, strings.stream());
}
return result;
}
方法二,使用flatMap方法,将集合变成stream, 再压平
private static Stream<String> concat2(List<Collection<String>> collections) {
return collections.stream()
.flatMap(Collection::stream);
}
对于不同集合类型的数据,如何做成一个统一的流?还是可以使用flatMap方法来做
方法三:
private static Stream<String> concat3(List<String> s1,String[] s2, Set<String> s3) {
return Stream.of(s1.stream(), Arrays.stream(s2), s3.stream())
.flatMap(Function.identity());
}
方法三和方法二相比,可以使用不同类型的集合类型来拼接流,方法二在拥有共同基类的情况下使用会显得简洁很多。