流
常用的流操作
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());
}