Eu posso entender porque Total1 é calculado, mas como Total2 é calculado Eu não tenho idéia! Como pode um BigDecimal :: add ser usado em uma BiFunction ? As assinaturas não são os mesmos !!!
package br.com.jorge.java8.streams.bigdecimal;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class BigDecimalSumTest {
public static void main(String[] args) {
List<BigDecimal> list = new ArrayList<>();
list.add(new BigDecimal("1"));
list.add(new BigDecimal("2"));
BigDecimal total1 = list.stream().reduce(BigDecimal.ZERO, (t, v) -> t.add(v));
BigDecimal total2 = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println("Total 1: " + total1);
System.out.println("Total 2: " + total2);
}
}
Dado BigDecimal::add
está sendo usado como um BiFunction<BigDecimal, BigDecimal, BigDecimal>
, o compilador irá procurar por uma das duas assinaturas elegíveis.
A primeira assinatura possível, como você pegou em diante, seria um método estático de dois argumentos. O lambda relevante seria (a, b) -> BigDecimal.add(a, b)
. Claro, você está correto para reconhecer que isso não existe.
A segunda assinatura possível seria um método de instância de um argumento. O lambda equivalente aqui seria (a, b) -> a.add(b)
. Como existe este eo outro não, é assim que o compilador iria interpretá-lo.