Il motivo per cui hai difficoltà a cogliere il significato di interfacce funzionali come quelle in java.util.function
è che le interfacce qui definite non hanno alcun significato! Sono presenti principalmente per rappresentare la struttura , non la semantica .
Questo è atipico per la maggior parte delle API Java. La tipica API Java, come una classe o un'interfaccia, ha un significato e puoi sviluppare un modello mentale per ciò che rappresenta e usarlo per comprendere le operazioni su di esso. Considera java.util.List
per esempio. A List
è un contenitore di altri oggetti. Hanno una sequenza e un indice. Il numero di oggetti contenuti nell'elenco viene restituito da size()
. Ogni oggetto ha un indice nell'intervallo 0..size-1 (incluso). L'oggetto all'indice i può essere recuperato chiamando list.get(i)
. E così via.
Le interfacce funzionali in java.util.function
non hanno questo significato. Sono invece interfacce che rappresentano semplicemente la struttura di una funzione, come il numero di argomenti, il numero di valori restituiti e (a volte) se un argomento o il valore restituito è una primitiva. Così abbiamo qualcosa di simile Function<T,R>
che rappresenta una funzione che prende un singolo parametro di tipo T e restituisce un valore di tipo R . Questo è tutto. Cosa fa quella funzione? Bene, può fare qualsiasi cosa ... purché richieda un singolo argomento e restituisca un singolo valore. Ecco perché la specifica per Function<T,R>
è poco più di "Rappresenta una funzione che accetta un argomento e produce un risultato".
Chiaramente, quando scriviamo codice, ha un significato e quel significato deve provenire da qualche parte. Nel caso delle interfacce funzionali, il significato deriva dal contesto in cui vengono utilizzate. L'interfaccia Function<T,R>
non ha significato da sola. Tuttavia, java.util.Map<K,V>
nell'API, c'è quanto segue:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(caratteri jolly elisi per brevità)
Ah, questo uso di Function
è come una "funzione di mappatura". Cosa fa? In questo contesto, se key
non è già presente nella mappa, viene chiamata la funzione di mappatura e viene consegnata la chiave e si prevede che produca un valore, e la coppia chiave-valore risultante viene inserita nella mappa.
Quindi non puoi guardare le specifiche per Function
(o qualsiasi altra interfaccia funzionale, se è per questo) e cercare di discernere cosa significano. Devi guardare dove vengono utilizzati in altre API per capire cosa significano e quel significato si applica solo a quel contesto.
Consumer
eSupplier
puoi anche cercare nel tutorial perConsumer
...