jdk - java se overview



使用Java 8減少鏈接的最佳方式 (4)

“更好”或“最佳”這兩個詞應該指代某些指標。 性能? 可讀性? 優雅?

Eran的答案顯示了一種方法,即為每個夥伴創建包含屬性值A,B,C和D的小流,並將這些值平面映射到更大的流中。 這種方法的求和順序是

A0 + B0 + C0 + D0  +  A1 + B1 + C1 + D1  + ... +  An + Bn + Cn + Dn

另一種選擇是創建屬性A,B,C和D的各個流,並在應用縮減之前連接這些流。 這可以通過嵌套的Stream#concat調用來完成,但使用具有標識功能的flatMap更加優雅和靈活:

Stream<BigDecimal> stream = Stream.of(
    entity.getAssociate().stream().map(Associates::getPropertyA),
    entity.getAssociate().stream().map(Associates::getPropertyB),
    entity.getAssociate().stream().map(Associates::getPropertyA),
    entity.getAssociate().stream().map(Associates::getPropertyC))
    .flatMap(Function.identity());

BigDecimal total = stream.reduce(BigDecimal.ZERO, BigDecimal::add);

關鍵是在這種情況下,求和順序是

A0 + A1 + ... + An + B0 + B1 + ... + Bn + C0 + C1 + ... + Cn 

(從技術上講,這可能不會產生很大的差異。但是這種方法在概念上與迄今為止提出的方法(就總和順序而言)不同,因此,作為一種選擇可能值得一提 - 另外,它更類似於您當前使用的方法,但沒有用於減少的破壞的標識值)

我有以下代碼,我正在努力改進:

BigDecimal total = entity.getAssociate().stream().map(Associates::getPropertyA)
    .reduce(BigDecimal.ZERO, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyB)
    .reduce(total, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyC)
    .reduce(total, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyD)
    .reduce(total, BigDecimal::add);

它有效,但它確實有一個更好的方法來做到這一點。 有人可以就此事啟發我嗎?


如果您可以將以下方法添加到Associates類:

public BigDecimal getSubtotal() {
    return propertyA.add(propertyB).add(propertyC).add(propertyD);
}

然後,完成任務很容易:

BigDecimal total = entity.getAssociate().stream()
    .map(Associate::getSubtotal)
    .reduce(BigDecimal::add)
    .orElse(BigDecimal.ZERO);

您可以簡單地在地圖中鍊式添加所有屬性:

BigDecimal total = entity.getAssociate().stream()
            .map(a -> a.getPropertyA()
                    .add(a.getPropertyB())
                    .add(a.getPropertyC())
                    .add(a.getPropertyD()))
            .reduce(BigDecimal.ZERO, BigDecimal::add);

請注意,這會更改添加數字的順序。


或者只是一個forEach

BigDecimal[] total = new BigDecimal[] { BigDecimal.ZERO };
entity.getAssociate().stream().forEach(a -> {
    total[0] = total[0].add(a.getPropertyA());
    // ... and so on for all others
});

作為一個方面 - 由於您違反了減少的identity ,因此當前的實現不是錯誤的。





java-8