Lambdas em java

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>