如何用lambda表達式優雅的寫出雙層for循環

public class Test {
    public static void main(String[] args) {
    /**
     * 找出長度大於一分鐘的曲目
     * @param albums
     * @return
     */
    public static 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 static Set<String> findLongTracks2(List<Album> albums){
        Set<String> trackNames = new HashSet<>();
        albums.stream()
                .forEach(album -> {
                    album.getTrackList().stream()
                            .forEach(track -> {
                                if (track.getLength() > 60){
                                    String name = track.getName();
                                    trackNames.add(name);
                                }
            });
        });
        return  trackNames;
    }

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

                });
        return  trackNames;
    }

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

    public static Set<String> findLongTracks5(List<Album> albums){
        return albums.stream()
                    .flatMap(album -> album.getTrackList().stream())
                    .filter(track -> track.getLength() > 60)
                    .map(track -> track.getName())
                    .collect(Collectors.toSet());
    }
}

    @Data
    class Album{
        private String name;
        private List<Track> trackList;
    }
    @Data
    class Track{
        private Long length;
        private String name;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章