追加します反復が行われたときに戻ります。だが、私はこのクラスを持っているとしましょう
しかし、私が望むのは、Javaストリームでこれを達成することです。以下は、私が持っているものである - それは動作しますが、私は1つのストリームにそれを凝縮させる方法がなければならないように感じる:
public BigDecimal addFields(List<Thing> things) {
BigDecimal field1sum = things.parallelStream()
.filter(thing -> thing.getField1() != null)
.map(Thing::getField1)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal field2sum = things.parallelStream()
.filter(thing -> thing.getField2() != null)
.map(Thing::getField2)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return field1sum.add(field2sum);
}
私は疑う答えは3つの引数を取りreduce()
方法は、1ですそのうちの1つはBiFunctionですが、私はそれをどうやって作るのか分かりませんでした。編集:私は(x,y) -> x.add(y)
にreduce()
に渡すことができると思うが、その後の質問はどうすればmap()
両方のフィールドですか?
さらに、この必須のコードを機能的なストリームに変えることは可能でしょうか?
public BigDecimal addOtherFields(List<Thing> things) {
BigDecimal result = BigDecimal.ZERO;
for (Thing thing : things) {
if (thing.getOtherField2() != null) {
BigDecimal otherField2 = thing.getOtherField2();
otherField2 = thing.getOtherField1().subtract(otherField2);
result = result.add(otherField2);
} else if (thing.getOtherField3() != null) {
BigDecimal otherField3 = thing.getOtherField3();
otherField3 = thing.getOtherField1.subtract(otherField3);
result = result.add(otherField3);
}
}
return result;
}
または、もう少し正確には、ストリームベースのアプローチでその条件付きチェックをどのように処理しますか?私はfilter()
ものを成功させようとしていました。