flatMap
概述
flatMap()
是Stream类中的方法,用于在Java中扁平化流。
Stream
流能够保存不同类型的数据。
Stream<T>
– 每个元素都是一个对象的流。IntStream
,DoubleStream
, 或者LongStream
– 每个元素都是原始数据类型的流。Stream<int[]>
– 每个元素都是原始数组的流。Stream<T[]>
– 每个元素都是一个对象数组的流。Stream<List<T>>
– 每个元素都是一个列表的流。Stream<Collection<T>>
– 每个元素都是一个集合的流。
flatMap用法
flatMap()
方法可用于在 Java 中扁平化流,如下所示:
Stream<T[]>
--> Stream<T>
Stream<List<T>>
--> Stream<T>
flatMap()
可以转换流 { {"A", "B", "C"}, {"D", "E", "F"} }
至
{ "A", "B", "C", "D", "E", "F" }
flatMap()
采用映射方法,该方法将应用于流的每个元素,以促进流的扁平化。
例子
多个List或两层List的扁平化
public static void main(String[] args) {
m1();
m2();
}
/**
* 多个list合并为一个list
* 1. Stream.of(l1, l2),产生的是Stream<List<String>>
* 2. flatmap,扁平化为一个流,Stream<String>
*/
public static void m1() {
List<String> l1 = Arrays.asList("A", "B");
List<String> l2 = Arrays.asList("C", "D");
List<String> list = Stream.of(l1, l2).flatMap(List::stream)
.collect(Collectors.toList());
log.info("list:{}", list);
}
/**
* 两层List的扁平为一层List
*/
public static void m2() {
List<List<String>> list = new ArrayList<>();
List<String> l1 = Arrays.asList("A", "B");
List<String> l2 = Arrays.asList("C", "D");
list.add(l1);
list.add(l2);
List<String> fList = list.stream()
.flatMap(List::stream).collect(Collectors.toList());
log.info("fList:{}", fList);
}
结果
19:27:12.728 [main] INFO com.xy.base.stream.FlatMapTest - list:[A, B, C, D]
19:27:12.744 [main] INFO com.xy.base.stream.FlatMapTest - fList:[A, B, C, D]
flatMapToInt
Stream.of()
原始整数数组上的方法返回 Stream<int[]>
.我们可以用 flatMapToInt()
转换原始数组流的方法 Stream<int[]>
至 IntStream
,然后转换为List<Integer>
public static void m3() {
int[] array1 = new int[]{1, 2};
int[] array2 = new int[]{3, 4};
List<Integer> list = Stream.of(array1, array2).flatMapToInt(Arrays::stream)
.boxed()
.collect(Collectors.toList());
log.info("list:{}", list);
}
结果
20:36:57.229 [main] INFO com.xy.base.stream.FlatMapTest - list:[1, 2, 3, 4]
类似的还有flatMapToDouble,flatMapToLong
参考资料
https://www.techiedelight.com/zh/flatten-streams-flatmap-method-java8/