JavaRush /Blog Java /Random-ES /Interfaces funcionales de Java
Алексей
Nivel 32

Interfaces funcionales de Java

Publicado en el grupo Random-ES
Una interfaz funcional en Java es una interfaz que contiene solo 1 método abstracto. El objetivo principal es utilizarlo en expresiones lambda y referencias de métodos.
Interfaces funcionales Java - 1
La presencia de 1 método abstracto es la única condición, por lo que una interfaz funcional también puede contener defaultmétodos static. Puede agregar la anotación @FunctionalInterface a una interfaz funcional. Esto no es necesario, pero si esta anotación está presente, el código no se compilará si hay más o menos de 1 método abstracto. Se recomienda agregar @FunctionalInterface. Esto le permitirá utilizar la interfaz en expresiones lambda sin preocuparse de que alguien agregue un nuevo método abstracto a la interfaz y deje de ser funcional. Java tiene interfaces funcionales integradas alojadas en el archivo java.util.function. No me detendré en ellos en detalle. Observo que los más utilizados son: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> y sus formas Bi . Se pueden encontrar más detalles en la página de documentación: Paquete 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
    }
}
Pero resulta que hay un punto sutil descrito en la Especificación del lenguaje Java: "las interfaces no heredan de Object, sino que declaran implícitamente muchos de los mismos métodos que Object". Esto significa que las interfaces funcionales pueden contener además métodos abstractos definidos en la clase Object. El siguiente código es válido, no habrá errores de compilación ni de tiempo de ejecución:
@FunctionalInterface
public interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
   // другие default o static методы
}
¡Ten cuidado durante la entrevista! ¡Buena suerte!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION