简述
在JDK8开始,列表操作新增了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑;
其中,flatMap()方法也是其中的API,flatMap()简单来说就是将多个stream流合并成一个stream,流变得扁平化, 当然你也可以在合并的时候结合其他的API做一些过滤或者转换之类的,如filter,下面详细阐述一下。
案例
1、先来一个简单的使用案例:
String[][]生成流,不用flatMap扁平化处理,依然可以使用 filter,map,collect对流做操作
public class StringArrayFlatMap {
public static void main(String[] args) {
String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};
String[] s = new String[] {"a","b"};
System.out.println(Arrays.toString(s));
//Stream<String[]>
Stream<String[]> temp = Arrays.stream(data);
//filter a stream of string[], and return a string[]?
List<String[]> list = temp
.filter(x -> "a".equals(x[0]))
.collect(Collectors.toList());
list.forEach(c-> System.out.println(Arrays.toString(c)));
}
}
2、List<Set<String>>案例:
Stream<Set<String>>,不用flatMap扁平化处理,依然可以使用 filter,map,collect对流做操作
public class StringSetFlatMap {
public static void main(String[] args) {
Student obj1 = new Student();
obj1.setName("mkyong");
obj1.addBook("Java 8 in Action");
obj1.addBook("Spring Boot in Action");
obj1.addBook("Effective Java (2nd Edition)");
Student obj2 = new Student();
obj2.setName("zilap");
obj2.addBook("Learning Python, 5th Edition");
obj2.addBook("Effective Java (2nd Edition)");
List<Student> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
//filter a stream of string[], and return a string[]?
List<Set<String>> collect = list.stream() //Stream<Student>
.map(Student::getBook) //Stream<Set<String>>
.filter(set -> set.contains("Java 8 in Action")) //Stream<Set<String>>
.distinct()
.collect(Collectors.toList());
collect.forEach(System.out::println);
}
}
3、List<List<String>>案例:
Stream<List<String>>,flatMap扁平化处理流
public class StreamFlatMap {
public static void main(String[] args) {
Student obj1 = new Student();
obj1.setName("mkyong");
obj1.addBook("Java 8 in Action");
obj1.addBook("Spring Boot in Action");
obj1.addBook("Effective Java (2nd Edition)");
Student obj2 = new Student();
obj2.setName("zilap");
obj2.addBook("Learning Python, 5th Edition");
obj2.addBook("Effective Java (2nd Edition)");
List<Student> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
Stream<String> stringStream = list.stream() //Stream<Student>
.map(Student::getBook) //Stream<Set<String>>
.flatMap(x -> x.stream()) //Stream<String>
.distinct(); //Stream<String>
stringStream.forEach(System.out::println);
List<String> collect =
list.stream() //Stream<Student>
.map(Student::getBook) //Stream<Set<String>>
.flatMap(x -> x.stream()) //Stream<String>
.distinct() //Stream<String>
.collect(Collectors.toList());
collect.forEach(x -> System.out.println(x));
}
}
4、flatMapToInt 案例
public class StreamIntFlatMap {
public static void main(String[] args) {
int[] intArray = {1, 2, 3, 4, 5, 6};
//1. Stream<int[]>
Stream<int[]> streamArray = Stream.of(intArray);
//2. Stream<int[]> -> flatMap -> IntStream
IntStream intStream = streamArray.flatMapToInt(Arrays::stream);
intStream.forEach(System.out::println);
}
}
参考
https://blog.youkuaiyun.com/Hatsune_Miku_/article/details/73435618
Stream<String[]> -> flatMap -> Stream<String>
Stream<Set<String>> -> flatMap -> Stream<String>
Stream<List<String>> -> flatMap -> Stream<String>
Stream<List<Object>> -> flatMap -> Stream<Object>
{[1,2],[3,4],[5,6]} - > flatMap - > [1,2,3,4,5,6]
{['a','b'],['c','d'],['e','f']} - > flatMap - > ['a','b','c' D”, 'E', 'F']