Javaストリームと集約BigDecimalにダブルスの地図を合計

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追加のためのアイデンティティ要素があります0BigDecimal.ZERO

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=227405&siteId=1