En esta publicación, usaré un ejemplo simple para ilustrar cómo funcionan las interfaces de función en Java 8.
1. Ejemplo simple de Stream.filter ()
El siguiente código se puede utilizar para filtrar una lista de cadenas especificando la longitud de la cadena.
package com.programcreek.java8.stream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class Java8Filter { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("java"); list.add("php"); list.add("python"); list.add("lisp"); list.add("c++"); //filter function Stream<String> stream = list.stream().filter(p -> p.length() > 3); String[] arr = stream.toArray(String[]::new); System.out.println(Arrays.toString(arr)); } } |
2. ¿Qué son las interfaces de función?
Una interfaz funcional es una interfaz con un único método abstracto. La API de Java tiene muchas interfaces de un método, como Runnable
, Callable
, Comparator
, ActionListener
etc.
Echemos un vistazo a la firma del método filter () de Stream:
Stream<T> filter(Predicate<? super T> predicate); |
Desde la firma del método de filter (), la expresión lambda p -> p.length() > 3
debe ser una instancia de Predicate. La interfaz Predicate tiene un método abstracto:
boolean test(T t) |
Debido a la característica orientada a objetos de Java, todo debería ser un objeto. Entonces, detrás de escena, la expresión lambda se convierte en un objeto de interfaz funcional.
3. Implementación del objeto de interfaz funcional
Es posible que sienta curiosidad por saber cómo se ve el objeto de la interfaz de función, Predicado. Podemos adivinar la posible implementación del método filter ():
Stream<T> filter(Predicate<? super T> predicate){ for (each string in stream){ if(predicate.test(string)){ keep the string }else{ drop the string } return stream; } |
El objeto predicado se convierte a partir de la expresión lambda dada.
También hay otras interfaces funcionales definidas. Revisar la paquete java.util.function para ver la lista completa.