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