java8 Steam實(shí)戰(zhàn)
假定選定一組專輯,找出其中所有長(zhǎng)度大于1分鐘的曲目名稱
public Set<String> findLongTracks(List<Album> albums) {
HashSet<Album> trackNames = new HashSet<Album>();
for (Album album : albums) {
for (Track track : album.getTrackList()) {
if (track.getLength() > 60) {
String name = track.getName();
trackNames.add(name);
}
}
}
return trackNames;
}
第一步要修改的是for循環(huán).
public Set<String> findLongTracks(List<Album> albums) {
HashSet<Album> trackNames = new HashSet<Album>();
albums.stream()
.forEach(album->{
album.getTracks()
.forEach(track ->{
if(track.getLength()>60){
String name = track.getName();
trackNames.add(name);
}
})
});
return trackNames;
}
第二步使用Stream操作
public Set<String> findLongTracks(List<Album> albums) {
HashSet<Album> trackNames = new HashSet<Album>();
albums.stream()
.forEach(album->{
album.getTracks()
.filter(track -> track.getLength()>60)
.map(track -> track.getName())
.forEach(name -> trackNames.add(name));
});
return trackNames;
}
第三步,將川籍轉(zhuǎn)化成一個(gè)曲目的Stream,這里使用flatMap操作,把多個(gè)Stream合并成一個(gè)Stream并返回.
public Set<String> findLongTracks(List<Album> albums) {
HashSet<Album> trackNames = new HashSet<Album>();
albums.stream()
.flatMap(album->album.getTracks())
.filter(track -> track.getLength()>60)
.map(track -> track.getName())
.forEach(name -> trackNames.add(name));
return trackNames;
}
第四步,Stream中有collect操作可以將Stream中的值轉(zhuǎn)換成一個(gè)列表
public Set<String> findLongTracks(List<Album> albums) {
return albums.stream()
.flatMap(album->album.getTracks())
.filter(track -> track.getLength()>60)
.map(track -> track.getName())
.forEach(name -> trackNames.add(name))
.collect(toSet());
}