Powodem, dla którego masz trudności ze zrozumieniem znaczenia funkcjonalnych interfejsów, takich jak te w, java.util.function
jest to, że zdefiniowane tutaj interfejsy nie mają żadnego znaczenia! Są obecne głównie w celu przedstawienia struktury , a nie semantyki .
Jest to nietypowe dla większości interfejsów API języka Java. Typowy interfejs API języka Java, taki jak klasa lub interfejs, ma znaczenie i można opracować model mentalny dla tego, co reprezentuje, i wykorzystać go do zrozumienia wykonywanych na nim operacji. Rozważmy java.util.List
na przykład. A List
to pojemnik z innymi przedmiotami. Mają sekwencję i indeks. Liczba obiektów zawartych na liście jest zwracana przez size()
. Każdy obiekt ma indeks z zakresu 0..size-1 (włącznie). Obiekt pod indeksem i można pobrać wywołując list.get(i)
. I tak dalej.
Funkcjonalne interfejsy java.util.function
nie mają takiego znaczenia. Zamiast tego są interfejsami, które po prostu reprezentują strukturę funkcji, taką jak liczba argumentów, liczba zwracanych wartości i (czasami) to, czy argument lub wartość zwracana jest prymitywem. Tak więc mamy coś Function<T,R>
co stanowi funkcję, która pobiera jeden argument typu T i zwraca wartość typu R . Otóż to. Co robi ta funkcja? Cóż, może zrobić wszystko ... o ile przyjmuje pojedynczy argument i zwraca pojedynczą wartość. Dlatego specyfikacja for Function<T,R>
to niewiele więcej niż „Reprezentuje funkcję, która przyjmuje jeden argument i generuje wynik”.
Oczywiście, kiedy piszemy kod, ma on znaczenie i to znaczenie musi skądś pochodzić. W przypadku funkcjonalnych interfejsów znaczenie wynika z kontekstu, w jakim są używane. Interfejs Function<T,R>
nie ma żadnego znaczenia w izolacji. Jednak w java.util.Map<K,V>
interfejsie API są następujące:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(dla zwięzłości pominięto symbole wieloznaczne)
Ach, to użycie Function
jest jako „funkcja mapowania”. Co to robi? W tym kontekście, jeśli key
nie jest jeszcze obecna w mapie, wywoływana jest funkcja odwzorowania, otrzymuje klucz i oczekuje się, że wygeneruje wartość, a wynikowa para klucz-wartość jest wstawiana do mapy.
Nie możesz więc spojrzeć na specyfikację Function
(lub żaden z innych funkcjonalnych interfejsów, jeśli o to chodzi) i spróbować rozróżnić, co one oznaczają. Musisz przyjrzeć się, gdzie są używane w innych interfejsach API, aby zrozumieć, co oznaczają, a znaczenie to dotyczy tylko tego kontekstu.
Consumer
iSupplier
może też przeszukać poradnik dlaConsumer
...