计算用户购买专辑的一些有用属性,如音乐家人数、曲目和专辑时长等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()); }