Java 使用streams和sum方法的BigDecimal列表的和

Java 使用streams和sum方法的BigDecimal列表的和,java,java-8,java-stream,Java,Java 8,Java Stream,若我们在列表中有所有int、long或其他基本数据类型值,那个么我们使用 return items.stream().mapToInt(i -> i).sum(); 我有一个BigDecimal值列表,如何使用Java8 由于没有像mapToBigDecimal这样的默认方法,我尝试创建普通映射,但无法使用您可以使用的sum() 一个简单的例子: List<BigDecimal> items = Arrays.asList(BigDecimal.ONE, BigDecimal

若我们在列表中有所有int、long或其他基本数据类型值,那个么我们使用

return items.stream().mapToInt(i -> i).sum();
我有一个BigDecimal值列表,如何使用
Java8

由于没有像mapToBigDecimal这样的默认方法,我尝试创建普通映射,但无法使用您可以使用的
sum()

一个简单的例子:

List<BigDecimal> items = Arrays.asList(BigDecimal.ONE, BigDecimal.valueOf(1.5), BigDecimal.valueOf(100));
items.stream().reduce((i, j) -> i.add(j)).ifPresent(System.out::println);
// Outputs 102.5
List items=Arrays.asList(BigDecimal.ONE,BigDecimal.valueOf(1.5),BigDecimal.valueOf(100));
items.stream().reduce((i,j)->i.add(j)).ifPresent(System.out::println);
//产出102.5
List items=Arrays.asList(BigDecimal.ONE,BigDecimal.valueOf(1.5),BigDecimal.valueOf(100));
items.stream().reduce(BigDecimal.ZERO,BigDecimal::add);

虽然Lisq199提供的答案有效,但我赞成包含Holger和Klitos注释,这不处理任何值,并且总是返回一个值

,或者,如果列表为空,则返回0:
.reduce(bigdecim.ZERO,(I,j)->I.add(j))
-这将返回一个BigDecimal而不是可选值。还可以使用方法引用
BigDecimal::add
替换lambda,因为它可以编译成
BinaryOperator
。但我建议不要这样做,因为在缺少
MathContext
的情况下,即使
add
也会产生
算术异常。更安全的实现是选择一些MathContext并使用lambda在其存在时添加。因为加法有一个中性元素,所以可以使用
reduce(BigDecimal.ZERO,BigDecimal::add)
,而不需要处理
Optional
@Mikhail Prokhorov:没有
MathContext
BigDecimal::add
将始终保留所有数字,并且从不抛出
算术异常。
List<BigDecimal> items = Arrays.asList(BigDecimal.ONE, BigDecimal.valueOf(1.5), BigDecimal.valueOf(100));
items.stream().reduce(BigDecimal.ZERO, BigDecimal::add);