Por que esse codigo funciona se o metodo nao recebe argumentos nextProbablePrime() da classe BigInteger
return Stream.iterate(TWO, BigInteger::nextProbablePrime);
Por que esse codigo funciona se o metodo nao recebe argumentos nextProbablePrime() da classe BigInteger
return Stream.iterate(TWO, BigInteger::nextProbablePrime);
Vamos dar uma olhada na assinatura do método:
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
se você observar Stream.iterate
usa generics
.
Podemos fazer, a seguinte inferência de tipo para o segundo argumento:
UnaryOperator<BigInteger> f
Olhando a definição de UnaryOperator<T>
, esse extende Function<T,R>
:
public interface UnaryOperator<T> extends Function<T,T>
Por consequência podemos fazer agora a seguinte inferência de tipo para a interface Function<T,R>
:
Function<BigInteger, BigInteger>
Você está fazendo o uso de uma referência de método
, BigInteger::nextProbablePrime
, o que avalia para uma instância da seguinte interface funcional:
p -> p.nextProbablePrime()
O que enquadra BigInteger::nextProbablePrime
no tipo UnaryOperator<BigInteger>
e por consequência no tipo extendido Function<BigInteger, BigInteger>