Stream.anyMatch
é definido como:
boolean anyMatch(Predicate<? super T> predicate)
Criei uma nova classe da seguinte forma:
class ClassA {
public boolean anyMethodName(Object o) {
return o instanceof Integer;
}
}
Então posso executar o seguinte:
List<String> durunitList = Arrays.asList("h", "d", "w", "m", "y");
ClassA classA = new ClassA();
System.out.println(durunitList.stream().peek(System.out::println).anyMatch(classA::anyMethodName));
Mas no meu ClassA
, não implementei Predicate
seu método funcional:
boolean test(T t)
Por que ainda pode classA::anyMethodName
ser passado para Stream.anyMatch(...)
?
O Java 8 adicionou a capacidade de as interfaces serem "interfaces funcionais" sempre que uma interface tiver um método abstrato. Se forem, o compilador permite que você use um método (como lambda ou referência de método
classA::anyMethodName
) como se fosse uma instância dessa interface, criando uma classe anônima para você (assumindo que ela tenha o mesmo tipo de retorno / parâmetros).Predicate
é uma interface funcional e, como tal, permite que você use seuclassA::anyMethodName
método diretamente como se fosse uma instância dePredicate
.No final, seu código é efetivamente traduzido em:
ClassA
nunca é convertidoPredicate
(já que não é um predicado...), mas uma nova classe anônima que implementa simplesmentePredicate
chamadasclassA.anyMethodName
nos bastidores.