English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Java Control de flujo

Java Arreglo

Java Programación Orientada a Objetos (I)

Java Programación Orientada a Objetos (II)

Java Programación Orientada a Objetos (III)

Manejo de excepciones en Java

Java Lista (List)

Java Cola (Queue)

Java Colecciones Map (Map)

Java Conjuntos (Set)

Java Entrada/Salida (I/O)

Java Reader/Writer

Otras temáticas de Java

Java 8 Interfaz funcional

Java 8 Nuevas características

Una interfaz funcional (Functional Interface) es una interfaz que tiene solo un método abstracto, pero puede tener varios métodos no abstractos.

Las interfaces funcionales pueden convertirse implícitamente en expresiones Lambda.

Expresiones Lambda y referencias a métodos (que también se pueden considerar como expresiones Lambda).

Por ejemplo, si se define una interfaz funcional así:

@FunctionalInterface
interface GreetingService 
{
    void sayMessage(String message);
}

Entonces se puede usar una expresión Lambda para representar una implementación de esta interfaz (nota: JAVA 8 Antes generalmente se implementaba con una clase anónima):

GreetingService greetService1 message -System.out.println("Hello ") + message);

las interfaces funcionales pueden proporcionar un soporte amigable a las expresiones lambda existentes.

JDK 1.8 interfaz funcional existente anteriormente:

  • java.lang.Runnable

  • java.util.concurrent.Callable

  • java.security.PrivilegedAction

  • java.util.Comparator

  • java.io.FileFilter

  • java.nio.file.PathMatcher

  • java.lang.reflect.InvocationHandler

  • java.beans.PropertyChangeListener

  • java.awt.event.ActionListener

  • javax.swing.event.ChangeListener

JDK 1.8 nuevas interfaces de función adicionadas:

  • java.util.function

java.util.function contiene muchas clases, que se utilizan para apoyar la programación funcional de Java, las interfaces funcionales en este paquete incluyen:

número de serieinterfaz & descripción
1BiConsumer<T,U>

representa una operación que acepta dos parámetros de entrada y no devuelve ningún resultado

2BiFunction<T,U,R>

representa un método que acepta dos parámetros de entrada y devuelve un resultado

3BinaryOperator<T>

representa una operación sobre dos operadores del mismo tipo y devuelve un resultado del mismo tipo

4BiPredicate<T,U>

representa un método booleano con dos parámetros

5BooleanSupplier

representa el proveedor de un resultado booleano

6Consumer<T>

representa una operación que acepta un parámetro de entrada y no devuelve ningún resultado

7DoubleBinaryOperator

representa una operación sobre operadores de dos valores double y devuelve un resultado double.

8DoubleConsumer

representa una operación que acepta un parámetro de valor double y no devuelve ningún resultado.

9DoubleFunction<R>

representa un método que acepta un parámetro de valor double y devuelve un resultado

10DoublePredicate

representa un método booleano con parámetro double

11DoubleSupplier

representa el proveedor de una estructura de valor double

12DoubleToIntFunction

Acepta un parámetro de tipo double, devuelve un resultado de tipo int.

13DoubleToLongFunction

Acepta un parámetro de tipo double, devuelve un resultado de tipo long.

14DoubleUnaryOperator

Acepta un parámetro de tipo double, el tipo de valor de retorno también es double.

15Function<T,R>

Acepta un parámetro de entrada, devuelve un resultado.

16IntBinaryOperator

Acepta dos parámetros de tipo int, el tipo de valor de retorno también es int.

17IntConsumer

Acepta un parámetro de tipo int, sin valor de retorno.

18IntFunction<R>

Acepta un parámetro de tipo int, devuelve un resultado.

19IntPredicate

Acepta un parámetro de tipo int, devuelve un resultado de tipo boolean.

20IntSupplier

Sin parámetros, devuelve un resultado de tipo int.

21IntToDoubleFunction

Acepta un parámetro de tipo int, devuelve un resultado de tipo double.

22IntToLongFunction

Acepta un parámetro de tipo int, devuelve un resultado de tipo long.

23IntUnaryOperator

Acepta un parámetro de tipo int, el tipo de valor de retorno también es int.

24LongBinaryOperator

Acepta dos parámetros de tipo long, el tipo de valor de retorno también es long.

25LongConsumer

Acepta un parámetro de tipo long, sin valor de retorno.

26LongFunction<R>

Acepta un parámetro de entrada de tipo long, devuelve un resultado.

27LongPredicate

R acepta un parámetro de entrada de tipo long, devuelve un resultado de tipo boolean.

28LongSupplier

Sin parámetros, devuelve un valor de tipo long.

29LongToDoubleFunction

Acepta un parámetro de tipo long, devuelve un resultado de tipo double.

30LongToIntFunction

Acepta un parámetro de tipo long, devuelve un resultado de tipo int.

31LongUnaryOperator

Acepta un parámetro de tipo long, el tipo de valor de retorno también es long.

32ObjDoubleConsumer<T>

Acepta un parámetro de tipo object y un parámetro de tipo double, sin valor de retorno.

33ObjIntConsumer<T>

Acepta un parámetro de tipo object y un parámetro de tipo int, sin valor de retorno.

34ObjLongConsumer<T>

Acepta un parámetro de tipo object y un parámetro de tipo long, sin retorno.

35Predicate<T>

Acepta un parámetro de entrada, devuelve un valor booleano.

36Supplier<T>

Sin parámetros, devuelve un resultado.

37ToDoubleBiFunction<T,U>

Acepta dos parámetros de entrada, devuelve un resultado de tipo double

38ToDoubleFunction<T>

Acepta un parámetro de entrada, devuelve un resultado de tipo double

39ToIntBiFunction<T,U>

Acepta dos parámetros de entrada, devuelve un resultado de tipo int.

40ToIntFunction<T>

Acepta un parámetro de entrada, devuelve un resultado de tipo int.

41ToLongBiFunction<T,U>

Acepta dos parámetros de entrada, devuelve un resultado de tipo long.

42ToLongFunction<T>

Acepta un parámetro de entrada, devuelve un resultado de tipo long.

43UnaryOperator<T>

Acepta un parámetro de tipo T, el tipo de retorno también es T.

Ejemplo de interfaz funcional

La interfaz Predicate <T> es una interfaz funcional, que acepta un parámetro de entrada T y devuelve un valor de resultado booleano.

Esta interfaz contiene varios métodos por defecto para combinar Predicate en otros lógicos complejos (por ejemplo: y, o, no).

Esta interfaz se utiliza para probar si un objeto es true o false.

Podemos ver el siguiente ejemplo (Java8para entender el uso de la interfaz funcional Predicate <T> en Tester.java):

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
 
public class Java8Tester {
   public static void main(String args[]){
      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        
      // Predicate<Integer> predicate = n ->true
      // n es un parámetro pasado al método test de la interfaz Predicate
      // n si existe, el método test devuelve true
        
      System.out.println("Imprimir todos los datos:");
        
      // pasar el parámetro n
      eval(list, n->true);
        
      // Predicate<Integer> predicate1 es igual a n -> n%}}2 es igual a 0
      // n es un parámetro pasado al método test de la interfaz Predicate
      // si n%2 para 0 el método test devuelve true
        
      System.out.println("Imprimir todos los números pares:");
      eval(list, n-> n%}}2 es igual a 0 );
        
      // Predicate<Integer> predicate2 es igual a n -> n > 3
      // n es un parámetro pasado al método test de la interfaz Predicate
      // Si n es mayor que 3 El método test devuelve true
        
      System.out.println("Salida mayor que 3 Todos los números:");
      eval(list, n-> n > 3 );
   }
    
   public static void eval(List<Integer> list, Predicate<Integer> predicate) {
      for(Integer n: list) {
        
         if(predicate.test(n)) {
            System.out.println(n + " ");
         }
      }
   }
}

Ejecutar el siguiente script, el resultado de salida será:

$ javac Java8Tester.java 
$ java Java8Tester
Salida de todos los datos:
1 
2 
3 
4 
5 
6 
7 
8 
9 
Salida de todos los números pares:
2 
4 
6 
8 
Salida mayor que 3 Todos los números del:
4 
5 
6 
7 
8 
9

Java 8 Nuevas características