Poznamy teraz kolejny zapis dający wygodę przy wywoływaniu konkretnej funkcji danego obiektu dla każdej instancji przebywającej w 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!

REFERENCJA DO METODY 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 zastosowań tylko dla kolekcji lub tablic w celu wielu wywołań tych samych metod pod rząd, 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. Jedyną różnicą jest to, że lambda "odwołuje się" do metody bezpośrednio, a referencja do metody przez odniesienie.

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":

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.

PROGRAM WYKORZYSTUJĄCY REFERENCJE DO METOD

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::mustBeRemoved);
	}

	private boolean mustBeRemoved(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. Funkcja "excludeNumbers" posiada wywołanie metody o której nie pisze się często na 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ę. 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. Natomiast 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! Gdyby metoda "mustBeRemoved" występowałaby hipotetycznie w "ArrayList", należałoby napisać "ArrayList::mustBeRemoved". Moim zdaniem, nic strasznego. Fakt, że można na początku się plątać, natomiast można się potem przyzwyczaić.


Tym stwierdzeniem kończę niniejszy wpis. Dziękuję serdecznie za przeczytanie od początku do końca. Referencja do metody to najbardziej zwięzły zapis ze wszystkich przedstawionych. Krótszego już nie znajdziecie.

PODOBNE ARTYKUŁY