Referencje Metod – Method References w Java 8 #10

W Javie 8 mamy bardzo ciekawą możliwość stosowania referencji do metod. Służy do tego symbol :: (podwójnego dwukropka). Używamy ich jak wyrażeń lambdy. Najważniejsze, jest to,  że w ten sposób nasze metody są reużywalne. Raz zdefiniowane mogą nam posłużyć w różnych miejscach kodu.

Najważniejszą rzecz jaką musimy zapamiętać, jeśli chodzi o referencje metod to taka, że możemy je używać tylko z interfejsem funkcjonalnym.

Jednym ze sposobów wykorzystania symbolu :: jest stworzenie za jego pomocą nowego obiektu. Czyli wykorzystanie referencji konstruktora. Wykorzystajmy to tego celu własny interfejs funkcjonalny BookCreator<Book>.

Na początek zobaczmy jak można stworzyć wyrażenie lambda za jego pomocą bez wykorzystania symbolu ::

Nieco inaczej będzie wyglądało, jeżeli zdefiniujemy wyrażenie lambda, używając referencji do konstruktora. Na początku definiujemy wyrażenie lambda i za pomocą Book::new określamy działanie naszego interfejsu. Wywołując metodę create przekazujemy parametry i tworzymy obiekty.

Teraz za pomocą naszego interfejsu i zdefiniowanej lambdy stworzymy sobie listę obiektów:

Lista posłuży nam do zaprezentowania innej możliwości wywołania metody za pomocą operatora :: . W tym przypadku będziemy odwoływać się do metody getPrice w naszych obiektach Book. Odwołując się do naszej listy i wywołując na niej metodę sort, możemy stworzyć takie wyrażenie, w którym do comparatora przekażemy referencję metody getPrice.

Zapis bez przekazywania referencji do metody jest trochę dłuższy i wygląda tak:

Zdecydowanie, użycie referencji do metod to mniej kodu, który jest bardziej czytelny.

Innym przykładem może być zdefiniowanie interfejsu Function w takiej postaci:

Jego zadaniem jest przekształcenie tytułu na duże litery. Zobaczmy jak możemy to zrobić za pomocą referencji do metody:

Wywołanie tej lambdy na naszej liście obiektów:

Wywołanie String::ToUpperCase może wydawać się dziwne bo nie jest to metoda statyczna. Jednak jest to możliwe, gdyż obiekt typu string w czasie wykonywania kodu zostanie odpowiednio podstawiony.

I na koniec ostatni przykład jak można użyć referencji metody wykorzystując JavaFx. Do przycisku możemy podpiąć metodę setOnAction i zaimplementować ją za pomocą lambdy w taki sposób:

Naciskając przycisk wyświetlimy napis na konsoli.

Możemy także zaimplementować akcję w inny sposób. Najpierw tworzymy metodę, którą chcemy podpiąć do przycisku:

A potem ją podpinamy:

Jakie są z tego korzyści? Mniej kodu, bardziej czytelny i co ważne łatwiejszy w testowaniu.

Pamiętajcie, że kod z przykładami jest oczywiście na githubie.

 

 

 

 

 

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *