Les mots "meilleur" ou "meilleure" devraient faire référence à une mesure. La performance ? Lisibilité ? Elégance ?
El réponse d'Eran montre une approche, à savoir la création de petits flux contenant les valeurs de propriété A, B, C et D pour chaque associé, et la mise à plat de ces valeurs dans un flux plus important. L'ordre d'addition dans cette approche est
A0 + B0 + C0 + D0 + A1 + B1 + C1 + D1 + ... + An + Bn + Cn + Dn
Une autre option serait de créer des flux individuels des propriétés A, B, C et D, et de concaténer ces flux avant d'appliquer la réduction. Cela pourrait être fait avec des Stream#concat
mais de manière plus élégante et plus souple en utilisant les appels flatMap
avec une fonction d'identité :
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);
Le point clé est que dans ce cas, l'ordre de sommation est
A0 + A1 + ... + An + B0 + B1 + ... + Bn + C0 + C1 + ... + Cn
(Techniquement, cela ne fait peut-être pas une grande différence. Mais c'est une approche qui est conceptuellement différent de ceux qui ont été proposés jusqu'à présent (en termes d'ordre de sommation), et peut donc être mentionné comme une option - en outre, il est plus similaire à l'approche que vous utilisez actuellement, mais sans la valeur d'identité brisée pour la réduction)