hotmeatballsoup:
私は、Java 8のストリームAPIを使用しようとしているmapToDoubleのように、のような方法を:
BigDecimal totalCost = order.getOrderlineList().stream()
.mapToDouble(Orderline::getPrice)
.sum();
問題はそれでOrderline::getPrice
戻ってBigDecimal
、ではありませんDouble
。したがって、上記の試みはコンパイルに失敗した(方法参照の不良戻りタイプ:doubeleするjava.math.BigDecimalオブジェクトを変換することはできません)。
それは見てOrderline#price
いるBigDecimal
、どのように私は(とのいずれかのストリームAPIを使用することができmapToDouble
、私を取得するか、似たような)totalCost
?
サミュエル・フィリップ:
あなたは追加する必要がありますBigDecimal
使用してSをBigDecimal.add()
倍増すると再び丸め誤差を避けるためにそれらを変換する代わりに。あなたが使用できるすべての価格を合計するにはStream.reduce()
:
BigDecimal bigDecimal = order.getOrderLines().stream()
.map(OrderLine::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
のドキュメントからStream.reduce()
:
行うこのストリームの要素に還元し、提供されたID値と連想蓄積機能を用いて、縮小値を返します。これはと同等です。
T result = identity; for (T element : this stream) result = accumulator.apply(result, element) return result;
BigDecimal::add
短縮形であり(a, b) -> a.add(b)
、単に返しますa + b
。追加のためのアイデンティティ要素があります0
かBigDecimal.ZERO
。