計算用戶購買專輯的一些有用屬性,如音樂家人數、曲目和專輯時長等java
命令式的實現:測試
public long countRunningTime() { long count = 0; for (Album album : albums) { for (Track track : album.getTracks()) { count += track.getLength(); } } return count; } public long countMusicians() { long count = 0; for (Album album : albums) { count += album.getMusicians().size(); } return count; } public long countTracks() { long count = 0; for (Album album : albums) { count += album.getTracks().size(); } return count; }
沒有重用公有的概念,寫出了更多代碼須要測試和維護code
使用流重構命令式的代碼:ci
public long countRunningTime() { return albums.stream() .mapToLong(album -> album.getTracks() .stream().mapToLong(track -> track.getLength()).sum()) .sum(); } public long countMusicians() { return albums.stream() .mapToLong(album -> album.getMusicians().size()) .sum(); } public long countTracks() { return albums.stream() .mapToLong(album -> album.getTracks().size()) .sum(); }
這段代碼仍有重用可讀性的問題,由於有一些抽象和共性只能使用領域內的只是來表達get
使用領域方法重構:io
public long countFeature(ToLongFunction<Album> function) { return albums.stream() .mapToLong(function).sum(); } public long countRunningTime() { return countFeature(album -> album.getTracks().stream() .mapToLong(track -> track.getLength()).sum()); } public long countMusicians() { return countFeature(album -> album.getMusicians().size()); } public long countTracks() { return countFeature(album -> album.getTracks().size()); }