JavaRush /Blogue Java /Random-PT /Interfaces funcionais Java
Алексей
Nível 32

Interfaces funcionais Java

Publicado no grupo Random-PT
Uma interface funcional em Java é uma interface que contém apenas 1 método abstrato. O objetivo principal é usá-lo em expressões lambda e referências de métodos.
Interfaces funcionais Java - 1
A presença de 1 método abstrato é a única condição, portanto uma interface funcional também pode conter defaultmétodos static. Você pode adicionar a anotação @FunctionalInterface a uma interface funcional. Isso não é obrigatório, mas se esta anotação estiver presente, o código não será compilado se houver mais ou menos de 1 método abstrato. Recomenda-se adicionar @FunctionalInterface. Isso permitirá que você use a interface em expressões lambda sem se preocupar com a possibilidade de alguém adicionar um novo método abstrato à interface e ela deixará de funcionar. Java possui interfaces funcionais integradas alojadas no java.util.function. Não vou me alongar sobre eles em detalhes. Observo que os mais utilizados são: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> e seus formulários Bi . Mais detalhes podem ser encontrados na página de documentação: Pacote java.util.function
import java.util.function.Predicate;

//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
    boolean test(Integer value);
}

public class Tester {
    public static void main(String[] args) throws Exception {
        MyPredicate myPredicate = x -> x > 0;
        System.out.println(myPredicate.test(10));   //true

        //Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
        Predicate<Integer> predicate = x -> x > 0;
        System.out.println(predicate.test(-10));    //false
    }
}
Mas acontece que há um ponto sutil descrito na especificação da linguagem Java: “as interfaces não herdam do Object, mas declaram implicitamente muitos dos mesmos métodos do Object”. Isso significa que as interfaces funcionais podem conter adicionalmente métodos abstratos definidos na classe Object. O código abaixo é válido, não haverá erros de compilação ou execução:
@FunctionalInterface
public interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
   // другие default or static методы
}
Tenha cuidado durante a entrevista! Boa sorte!
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION