java8 Steam實戰(zhàn)
假定選定一組專輯,找出其中所有長度大于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)化成一個曲目的Stream,這里使用flatMap操作,把多個Stream合并成一個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)換成一個列表
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());
}