Я придумал следующую реализацию Collector для решения этой проблемы. Это написано в Groovy, поэтому вам придется адаптировать его, если вы используете только Java, но у него есть преимущество в поддержке потока произвольных типов, если эти типы поддерживаются ctor BigDecimal:
public static <T> Collector<T, ?, BigDecimal> summingBigDecimal() {
new java.util.stream.Collectors.CollectorImpl<?, ?, BigDecimal>(
{ [BigDecimal.ZERO].toArray(new BigDecimal[1]) },
{ BigDecimal[] a, Object t ->
a[0] = (t instanceof BigDecimal ? a[0].add(t) : a[0].add(new BigDecimal(t)))
},
{ BigDecimal[] a, BigDecimal[] b -> a[0].add(b[0]) },
{ BigDecimal[] a -> a[0] }, Collections.emptySet());
}
Я уверен, что его можно немного очистить, но он может делать такие вещи, как:
Stream.of("1", 3L, new BigDecimal("5")).collect(Collectors.summingBigDecimal())
... оказался полезным в определенных ситуациях, когда я не хочу, чтобы меня беспокоили сделайте преобразование самостоятельно.