java8

常用的流操作

collect.(toList())

概述
collect(toList()) 方法由 Stream 里的值生成一个列表,是一个及早求值操作

List<String> collected = Stream.of("a", "b", "c") n
.collect(Collectors.toList()); o
assertEquals(Arrays.asList("a", "b", "c"), collected); 

表示从Stream中生成一个列表

map

概述
如果有一个函数可以将一种类型的值转换成另外一种类型,map 操作就可以
使用该函数,将一个流中的值转换成一个新的流
代码

List<String> collected = Stream.of("a", "b", "hello")
.map(string -> string.toUpperCase()) 
.collect(toList());
assertEquals(asList("A", "B", "HELLO"), collected);

filter

概述
遍历数据并检查其中的元素时,可尝试使用 Stream 中提供的新方法 filter
代码

List<String> beginningWithNumbers = Stream.of("a", "1abc", "abc1")
//isDigit自定义过滤函数
.filter(value -> isDigit(value.charAt(0)))
.collect(toList());
assertEquals(asList("1abc"), beginningWithNumbers);

flatMap

概述
flatMap 方法可用 Stream 替换值,然后将多个 Stream 连接成一个 Stream进行处理
代码
假如有多个列表的流,现在希望得到所有的数字的序列

List<Integer> together = Stream.of(asList(1, 2), asList(3, 4))
.flatMap(numbers -> numbers.stream())
.collect(toList());
assertEquals(asList(1, 2, 3, 4), together);

max 和 min

概述
求最大值和最小值
代码

List<Track> tracks = asList(new Track("Bakai", 524),
new Track("Violets for Your Furs", 378),
new Track("Time Was", 451));

Track shortestTrack = tracks.stream().min(Comparator.comparing(track -> track.getLength())).get();
assertEquals(tracks.get(1), shortestTrack);

案例分析

题目:找出所有长度大于 1 分钟的曲目名称
初始方案:初始化一个 Set 对象,用来保存找到的曲目名称。然后使用 for 循环遍历所有专辑,每次
循环中再使用一个 for 循环遍历每张专辑上的每首曲目,检查其长度是否大于 60 秒,如
果是,则将该曲目名称加入 Set 对象。
代码

public Set<String> findLongTracks(List<Album> albums) {
Set<String> trackNames = new HashSet<>();
for(Album album : albums) {
     for (Track track : album.getTrackList()) {
          if (track.getLength() > 60) {
              String name = track.getName();
              trackNames.add(name);}}
    }
   return trackNames;
}

整改一

public Set<String> findLongTracks(List<Album> albums) {
Set<String> trackNames = new HashSet<>();
albums.stream().forEach(album -> {
        album.getTracks()
              .filter(track -> track.getLength() > 60)
              .map(track -> track.getName())
              .forEach(name -> trackNames.add(name));
});
return trackNames;
}

最终整改

使用flatMap 、Collect 替代foreach

public Set<String> findLongTracks(List<Album> albums) {
            return albums.stream()
                                  .flatMap(album -> album.getTracks())
                                  .filter(track -> track.getLength() > 60)
                                  .map(track -> track.getName())
                                  .collect(toSet());
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容