Java 8 - Interfacce funzionali
Le interfacce funzionali hanno un'unica funzionalità da mostrare. Ad esempio, un'interfaccia Comparable con un unico metodo "compareTo" viene utilizzata a scopo di confronto. Java 8 ha definito molte interfacce funzionali da utilizzare ampiamente nelle espressioni lambda. Di seguito è riportato l'elenco delle interfacce funzionali definite nel pacchetto java.util.Function.
Sr.No. | Interfaccia e descrizione |
---|---|
1 | BiConsumer<T,U> Rappresenta un'operazione che accetta due argomenti di input e non restituisce alcun risultato. |
2 | BiFunction<T,U,R> Rappresenta una funzione che accetta due argomenti e produce un risultato. |
3 | BinaryOperator<T> Rappresenta un'operazione su due operandi dello stesso tipo, producendo un risultato dello stesso tipo degli operandi. |
4 | BiPredicate<T,U> Rappresenta un predicato (funzione con valori booleani) di due argomenti. |
5 | BooleanSupplier Rappresenta un fornitore di risultati con valori booleani. |
6 | Consumer<T> Rappresenta un'operazione che accetta un singolo argomento di input e non restituisce alcun risultato. |
7 | DoubleBinaryOperator Rappresenta un'operazione su due operandi a doppio valore e produce un risultato a doppio valore. |
8 | DoubleConsumer Rappresenta un'operazione che accetta un singolo argomento a doppio valore e non restituisce alcun risultato. |
9 | DoubleFunction<R> Rappresenta una funzione che accetta un argomento a doppio valore e produce un risultato. |
10 | DoublePredicate Rappresenta un predicato (funzione con valore booleano) di un argomento con valore doppio. |
11 | DoubleSupplier Rappresenta un fornitore di risultati a doppio valore. |
12 | DoubleToIntFunction Rappresenta una funzione che accetta un argomento a doppio valore e produce un risultato con valore int. |
13 | DoubleToLongFunction Rappresenta una funzione che accetta un argomento con valore doppio e produce un risultato con valore lungo. |
14 | DoubleUnaryOperator Rappresenta un'operazione su un singolo operando con valore doppio che produce un risultato con valore doppio. |
15 | Function<T,R> Rappresenta una funzione che accetta un argomento e produce un risultato. |
16 | IntBinaryOperator Rappresenta un'operazione su due operandi con valore int e produce un risultato con valore int. |
17 | IntConsumer Rappresenta un'operazione che accetta un singolo argomento con valore int e non restituisce alcun risultato. |
18 | IntFunction<R> Rappresenta una funzione che accetta un argomento con valore int e produce un risultato. |
19 | IntPredicate Rappresenta un predicato (funzione con valori booleani) di un argomento con valori int. |
20 | IntSupplier Rappresenta un fornitore di risultati con valore int. |
21 | IntToDoubleFunction Rappresenta una funzione che accetta un argomento con valore int e produce un risultato con valore doppio. |
22 | IntToLongFunction Rappresenta una funzione che accetta un argomento con valore int e produce un risultato con valore lungo. |
23 | IntUnaryOperator Rappresenta un'operazione su un singolo operando con valore int che produce un risultato con valore int. |
24 | LongBinaryOperator Rappresenta un'operazione su due operandi con valore lungo e produce un risultato con valore lungo. |
25 | LongConsumer Rappresenta un'operazione che accetta un singolo argomento con valori lunghi e non restituisce alcun risultato. |
26 | LongFunction<R> Rappresenta una funzione che accetta un argomento con valori lunghi e produce un risultato. |
27 | LongPredicate Rappresenta un predicato (funzione con valori booleani) di un argomento con valori lunghi. |
28 | LongSupplier Rappresenta un fornitore di risultati valutati a lungo. |
29 | LongToDoubleFunction Rappresenta una funzione che accetta un argomento con valore lungo e produce un risultato con valore doppio. |
30 | LongToIntFunction Rappresenta una funzione che accetta un argomento con valore lungo e produce un risultato con valore int. |
31 | LongUnaryOperator Rappresenta un'operazione su un singolo operando con valore lungo che produce un risultato con valore lungo. |
32 | ObjDoubleConsumer<T> Rappresenta un'operazione che accetta un argomento con valore di oggetto e un argomento con valore doppio e non restituisce alcun risultato. |
33 | ObjIntConsumer<T> Rappresenta un'operazione che accetta un argomento con valore oggetto e un argomento con valore int e non restituisce alcun risultato. |
34 | ObjLongConsumer<T> Rappresenta un'operazione che accetta un argomento con valori di oggetto e uno con valori lunghi e non restituisce alcun risultato. |
35 | Predicate<T> Rappresenta un predicato (funzione con valori booleani) di un argomento. |
36 | Supplier<T> Rappresenta un fornitore di risultati. |
37 | ToDoubleBiFunction<T,U> Rappresenta una funzione che accetta due argomenti e produce un risultato a doppio valore. |
38 | ToDoubleFunction<T> Rappresenta una funzione che produce un risultato a doppio valore. |
39 | ToIntBiFunction<T,U> Rappresenta una funzione che accetta due argomenti e produce un risultato con valore int. |
40 | ToIntFunction<T> Rappresenta una funzione che produce un risultato con valore int. |
41 | ToLongBiFunction<T,U> Rappresenta una funzione che accetta due argomenti e produce un risultato con valori lunghi. |
42 | ToLongFunction<T> Rappresenta una funzione che produce un risultato con valore lungo. |
43 | UnaryOperator<T> Rappresenta un'operazione su un singolo operando che produce un risultato dello stesso tipo del relativo operando. |
Esempio di interfaccia funzionale
L'interfaccia Predicate <T> è un'interfaccia funzionale con un metodo test (Object) per restituire un valore booleano. Questa interfaccia indica che un oggetto viene verificato per essere vero o falso.
Crea il seguente programma Java utilizzando qualsiasi editor di tua scelta, ad esempio C: \> JAVA.
Java8Tester.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 is passed as parameter to test method of Predicate interface
// test method will always return true no matter what value n has.
System.out.println("Print all numbers:");
//pass n as parameter
eval(list, n->true);
// Predicate<Integer> predicate1 = n -> n%2 == 0
// n is passed as parameter to test method of Predicate interface
// test method will return true if n%2 comes to be zero
System.out.println("Print even numbers:");
eval(list, n-> n%2 == 0 );
// Predicate<Integer> predicate2 = n -> n > 3
// n is passed as parameter to test method of Predicate interface
// test method will return true if n is greater than 3.
System.out.println("Print numbers greater than 3:");
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 + " ");
}
}
}
}
Qui abbiamo passato l'interfaccia Predicate, che accetta un singolo input e restituisce Boolean.
Verifica il risultato
Compila la classe usando javac compilatore come segue -
C:\JAVA>javac Java8Tester.java
Ora esegui Java8Tester come segue:
C:\JAVA>java Java8Tester
Dovrebbe produrre il seguente output:
Print all numbers:
1
2
3
4
5
6
7
8
9
Print even numbers:
2
4
6
8
Print numbers greater than 3:
4
5
6
7
8
9