2014-07-18 13 views
6

Przyglądałem się niektórym zmianom wprowadzonym w Java SE API z wersją 1.8, a ja, patrząc na nową metodę Map.merge, pokazuje ona przykład użycia jej z liniaNieparzysta składnia w API "String :: concat"

map.merge(key, msg, String::concat) 

rozumiem jak używać wyrażeń lambda do tworzenia anonimowych interfejsy funkcjonalne, ale to wydaje się stosować metodę jako BiFunction. Lubię rozumieć i używać niejasnych składni java, ale nigdzie nie mogę znaleźć żadnej wzmianki o tym.

Odpowiedz

5

String::concat to odwołanie do metody klasy String określonej w metodzie concat().

BiFunction funkcjonalnego interfejs z jednej metody apply że dwa parametry (pierwszy typ T i drugiego typu U) i zwraca wynik typu R (innymi słowy, interfejs BiFunction<T,U,R> ma metoda R apply(T t, U u)).

map.merge oczekuje trzeciego jako BiFunction<? super V,? super V,? extends V>, gdzie V jest wartością Map. Jeśli masz wartość Map z wartością String, możesz użyć dowolnej metody, która akceptuje dwa parametry: String i zwraca wartość String.

String::concat spełnia te wymagania, dlatego można go używać w wersji map.merge.

Powodem spełnia te wymagania, wymaga wyjaśnienia:

Podpis String::concat jest public String concat(String str).

Może to być postrzegane jako funkcja z dwoma parametrami typu String (this, instancja, dla której wywoływana jest ta metoda, oraz parametr str) i wynikiem typu String.

+2

Opisy metod opisano tutaj: http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html – msandiford

+0

Dzięki. Zgadłem, że tak. Zastanawiam się, jakie są zasady korzystania z metody jako interfejsu funkcjonalnego? – yesennes

+0

@msandiford Dzięki! tego właśnie szukałem. – yesennes