Lambda化的一個例子

計算用戶購買專輯的一些有用屬性,如音樂家人數、曲目和專輯時長等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());
}
相關文章
相關標籤/搜索