场景
Java8新特性-Stream对集合进行操作的常用API:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657
前面讲Stream的常用api中讲到map的使用
//map 与 flatmap //map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 //给每个User的年龄加10 注意此时后面再次forEach的时候,每个item代表的是age,则不再是user了 //userList.stream().map(user -> user.getAge() + 10).collect(Collectors.toList()).forEach(item -> System.out.println(item)); //另外除了map之外还有一个flatmap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
java8中map与flatmap的区别
map的使用示例参考上面
flatmap
flatmap操作具有将一对多转换应用于流的操作,然后将生成的元素展平为新流的操作;
返回一个流,将流包含的每个元素替换为通过将提供的映射函数应用与每个元素而生成的映射流的内容的结果,
在将其内容放入此流后,每个映射的流都将关闭。
一句话总结:
将几个小的list转换为一个大的list
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
1、举个例子
一个专辑包含多个曲目,曲目有名称、时长属性,要从一个专辑的list中筛选中时长大于70的名称的list。
新建曲目对象
package com.ruoyi.demo.domain; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Track { private String trackName; private float length; }
新建专辑对象
package com.ruoyi.demo.domain; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Album { private String albumName; private List<Track> trackList; }
构造需要的模拟数据
//构造模拟数据 List<Album> albumList = new ArrayList<>(); Album album1 = Album.builder() .albumName("album1") .trackList(new ArrayList<Track>(){{ this.add(Track.builder().trackName("a").length(60f).build()); this.add(Track.builder().trackName("b").length(70f).build()); this.add(Track.builder().trackName("c").length(80f).build()); this.add(Track.builder().trackName("d").length(90f).build()); }}) .build(); Album album2 = Album.builder() .albumName("album2") .trackList(new ArrayList<Track>(){{ this.add(Track.builder().trackName("e").length(50f).build()); this.add(Track.builder().trackName("f").length(70f).build()); this.add(Track.builder().trackName("g").length(30f).build()); this.add(Track.builder().trackName("h").length(90f).build()); }}) .build(); albumList.add(album1); albumList.add(album2);
2、按照之前嵌套循环的写法
//嵌套循环方式实现查找长度大于70的曲目,并获取曲目名 List<String> trackNames = new ArrayList<>(); for(Album album:albumList){ for(Track track:album.getTrackList()){ if(track.getLength()>70){ trackNames.add(track.getTrackName()); } } }
3、引入流的flatmap的写法
public static List<String> findLongTracks(List<Album> albums){ return albums.stream() .flatMap(album -> album.getTrackList().stream()) .filter(track -> track.getLength()>70) .map(track -> track.getTrackName()) .collect(Collectors.toList()); }
这里先用flatmap将每个专辑的所有曲目组成一个大的list;
再调用filter进行过滤时长大于70的曲目;
再调用map获取每个曲目的名称;
最后转换为list。
输出结果查看
//重构使用流的操作 List<String> longTracks = findLongTracks(albumList); longTracks.forEach(System.out::println);