java8 stream 的 flatmap 跟map有啥区别?有例子不
欢迎选择我的课程,让我们一起见证您的进步~~
flatmap可以在lamda中返回集合,然后flat为单个元素一个个放入最后的结果集中。比如Person里头有个多个Hobby(List<Hobby>),那我想获取所有人的所有hobby,则可以:List<Person> persons = ...Set<Hobby> hobbySet = persons.parallelStream().flatMap(p -> p.getHobbyList.stream()).collect(Collectors.toCollection(() -> new TreeSet<Hobby>( (h1,h2) -> h1.getName().compareTo(h2.getName()))))
比如一个List<?>,map能够直接操作list中的每个对象
List<Integer> integers = new ArrayList<>(); //添加数据略 integers.stream.map(i -> i + 1).foreach(System.out::println);
而使用flatmap使我们能够操作更深一层的数据,如下:List<List<?>>
List<List<Integer>> outer = new ArrayList<>(); List<Integer> inner1 = new ArrayList<>(); inner1.add(1); List<Integer> inner2 = new ArrayList<>(); inner1.add(2); List<Integer> inner3 = new ArrayList<>(); inner1.add(3); List<Integer> inner4 = new ArrayList<>(); inner1.add(4); List<Integer> inner5 = new ArrayList<>(); inner1.add(5); outer.add(inner1); outer.add(inner2); outer.add(inner3); outer.add(inner4); outer.add(inner5); List<Integer> result = outer.stream().flatMap(inner -> inner.stream().map(i -> i + 1)).collect(toList()); System.out.println(result);
map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗;
map方法示意图:
flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中;
flatMap方法示意图:
flatmap可以在lamda中返回集合,然后flat为单个元素一个个放入最后的结果集中。
比如Person里头有个多个Hobby(List<Hobby>),那我想获取所有人的所有hobby,则可以:
List<Person> persons = ...
Set<Hobby> hobbySet = persons.parallelStream().flatMap(p -> p.getHobbyList.stream())
.collect(Collectors.toCollection(() -> new TreeSet<Hobby>(
(h1,h2) -> h1.getName().compareTo(h2.getName())
)))
比如一个List<?>,map能够直接操作list中的每个对象
而使用flatmap使我们能够操作更深一层的数据,如下:
List<List<?>>
map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗;
map方法示意图:
flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中;
flatMap方法示意图: