Jason. Cała informatyka w jednym miejscu!

Poznamy teraz kolejny zapis dający wygodę przy wywoływaniu konkretnej metody danego obiektu dla każdego elementu przebywającego w tablicy / kolekcji. Gdzie tam zwykła pętla "for" czy nawet pętla rozszerzona. Nawet wyrażenie lambda ukazane całkiem niedawno można jeszcze bardziej skrócić. Niech Wam posłuży referencja do metody w języku Java!

REFERENCJA DO METODY W JĘZYKU JAVA NAJKRÓTSZYM ZAPISEM ZE WSZYSTKICH

Zapis przypomina język C++ ze względu na budowę, gdyż tutaj wykorzystuje się dwa znaki dwukropka obok siebie celem odwołania się do metody. Właśnie on pozwala na zidentyfikowanie referencji. Sam zapis nie jest "przypisany" do tego zastosowania tylko dla kolekcji oraz tablic w celu wywołania tej samej metody dla każdego elementu, aczkolwiek do jakiego artykułu nie zajrzycie, będziecie widzieć zastosowanie dla jakiegoś zbioru danych i ukazanie, że można obsłużyć wszystkie obiekty w ten sam sposób, ale bez użycia żadnej pętli. Działa identycznie jak wyrażenie lambda składające się z jednej instrukcji. Jedyną różnicą jest to, że lambda "odwołuje się" do metody bezpośrednio, a referencja do metody przez odniesienie do już istniejącej metody w kodzie.

Celem ukazania faktycznego skrócenia zapisu, rzućmy okiem ponownie na wyrażenie lambda. Zakładamy, że "numbers" to "ArrayList" i wywołujemy metodę "forEach" do której wprowadzamy lambdę:

numbers.forEach(s -> System.out.println(s));

A tak wyglądałaby referencja do metody wykonująca tę samą rzecz:

numbers.forEach(System.out::println);

"Wzór" na to jest stosunkowo łatwy. Zaczynamy od podania klasy (po tym może być jeszcze instancja jak przy "System.out"), potem dwa znaki dwukropka, a następnie metoda występująca w danej klasie (lub instancji), o ile jest publiczna. Napisałem o podobieństwie do C++, gdyż pisząc w nim "cout", musimy wpierw odwołać się do klasy "std" właśnie za pomocą dwóch dwukropków, chyba że korzystamy z przestrzeni nazw. Wypisywanie tekstu nie należy do ciekawych obserwacji więc przejdziemy do przykładowego kodu źródłowego. W nim będziemy widzieli ciekawsze rzeczy.

PRZYKŁAD KODU ŹRÓDŁOWEGO

Zerknijcie na to. Dodałem kolekcję "ArrayList" o której wspomniałem wyżej, ale dodałem coś jeszcze. Coś, czego na pewno nigdzie nie prezentowałem. Czy potraficie to dostrzec?

KLASA "MAIN"

public class Main {
	public static void main(String[] args) {
		new MethodReference();
	}
}

KLASA "METHODREFERENCE"

import java. util.ArrayList;

public class MethodReference {
	private ArrayList<Integer> numbers = new ArrayList<>();

	public MethodReference() {
		addNumbers();
		excludeNumbers();
		printNumbers();
	}

	private void addNumbers() {
		numbers.add(65);
		numbers.add(13);
		numbers.add(2);
		numbers.add(-700);
	}

	private void excludeNumbers() {
		numbers.removeIf(this::numberIsBelowTwelve);
	}

	private boolean numberIsBelowTwelve(int n) {
		return n < 12;
	}

	private void printNumbers() {
		numbers.forEach(System.out::println);
	}
}

Referencja do metody jest i to dwukrotnie, aczkolwiek dodałem coś jeszcze, aby zobrazować Wam potęgę tego zapisu. Metoda "excludeNumbers" posiada wywołanie metody o której nie pisze się często w artykułach o podstawach z Javy. "removeIf" służy do wyselekcjonowania pewnych obiektów z kolekcji, które spełniają konkretny warunek zwracany przez inną metodę (musi zwracać wartość "boolean"!). Jeśli test przejdzie pozytywnie, zostaje on usuwany z listy. W przeciwnym razie jest nietknięty. Każda metoda "biorąca udział" w odwoływaniu się przez referencję, musi posiadać parametr reprezentujący pojedynczy argument ("removeIf" wymaga dodatkowo zwracania wartości logicznej). Referencja do metody tego WYMAGA.

To nie koniec atrakcji. Spójrzcie na przedrostek "this". Jak napisałem, odwołujemy się (wpierw) do nazwy klasy. KLASY, nie instancji obiektu ani kolekcji, ani tablicy, ani czegokolwiek innego! Gdyby metoda "numberIsBelowTwelve" występowała hipotetycznie w "ArrayList", należałoby napisać "ArrayList::numberIsBelowTwelve". Fakt, że można na początku się zaplątać, natomiast można się potem przyzwyczaić.

Referencja do metody to najbardziej zwięzły zapis ze wszystkich przedstawionych. Krótszego już nie znajdziecie. Trzeba jednak wiedzieć, że nie będzie pasować do wszystkich instrukcji, które możecie wykonać za pomocą lambdy albo idąc po całości "na piechotę" (pętla "for", "if'y" itd.).


Tym stwierdzeniem kończę niniejszy wpis. Dziękuję serdecznie za przeczytanie od początku do końca.

PODOBNE ARTYKUŁY