package com.insightfullogic.java8.examples.chapter3;
import com.insightfullogic.java8.examples.chapter1.Album;
import com.insightfullogic.java8.examples.chapter1.Track;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static java.util.stream.Collectors.toSet;
public class Refactor {
public static interface LongTrackFinder {
public Set<String> findLongTracks(List<Album> albums);
}
public static class Step0 implements LongTrackFinder {
// BEGIN findLongTracks_0
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;
}
// END findLongTracks_0
}
public static class Step1 implements LongTrackFinder {
// BEGIN findLongTracks_1
public Set<String> findLongTracks(List<Album> albums) {
Set<String> trackNames = new HashSet<>();
albums.stream()
.forEach(album -> {
album.getTracks()
.forEach(track -> {
if (track.getLength() > 60) {
String name = track.getName();
trackNames.add(name);
}
});
});
return trackNames;
}
// END findLongTracks_1
}
public static class Step2 implements LongTrackFinder {
// BEGIN findLongTracks_2
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;
}
// END findLongTracks_2
}
public static class Step3 implements LongTrackFinder {
// BEGIN findLongTracks_3
public Set<String> findLongTracks(List<Album> albums) {
Set<String> trackNames = new HashSet<>();
albums.stream()
.flatMap(album -> album.getTracks())
.filter(track -> track.getLength() > 60)
.map(track -> track.getName())
.forEach(name -> trackNames.add(name));
return trackNames;
}
// END findLongTracks_3
}
public static class Step4 implements LongTrackFinder {
// BEGIN findLongTracks_4
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());
}
// END findLongTracks_4
}
}