计算用户购买专辑的一些有用属性,如音乐家人数、曲目和专辑时长等
命令式的实现:
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;
}
没有重用公有的概念,写出了更多代码需要测试和维护
使用流重构命令式的代码:
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();
}
这段代码仍有重用可读性的问题,因为有一些抽象和共性只能使用领域内的只是来表达
使用领域方法重构:
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());
}