W tym artykule pokażę Ci kolejną fajową składniową rzecz 🙂! Ona nie jest trudna, a wzniesie jakość Twojego kodu na wyższy poziom 📈!!! Rzucam tajemnicze słowo "Consumer" w języku Java 😲 i od razu zapraszam do środeczka 😈!

"CONSUMER" W JĘZYKU JAVA. MAŁA RZECZ, A (U)CIESZY

Zaznaczam na wstępie, że to nie ma nic wspólnego z konsumowaniem 😁. Może to na początek wydawać się absurdalne, aczkolwiek nie ja jestem twórcą słów kluczowych i nazw jakie występują w Javie ☕. Także o co może chodzić 🙂?

Zacznę od tego, że to dotyczy definicji metody jaką sobie wymyślimy. Jak już zapewne wiesz, do metod wrzucamy różne instrukcje, które są już definitywne. Kiedy napiszemy je raz, to nie ma jak ich zmienić.

A co, jak Ci napiszę, że po części...możesz sprawić, żeby się zmieniały?

Da się tak zrobić, żeby, pisząc abstrakcyjnie, dodać do metody miejsce na "zamienne instrukcje" 🔧. Tym miejscem jest parametr, a tym "cosikiem" jest...metoda 😲!

"Consumer" w języku Java, to innymi słowy parametr metody w postaci definicji innej metody typu "void" w formie wyrażenia lambda. Java przyjmuje cztery rodzaje wstawiane w miejsce parametru i dzieli je na różne słówka:

  • "Consumer" (metoda typu "void" przyjmująca jeden parametr) 👈 tu jesteś 😊,
  • "Function" (metoda zwracająca wartość i przyjmująca jeden parametr),
  • "Predicate" (wyrażenie zwracające wartość logiczną przyjmujące jeden parametr),
  • "Supplier" (metoda zwracająca wartość i nieprzyjmująca żadnych parametrów).

W tym artykule skupiamy się na pierwszym typie 1️⃣. W rzeczywistości, są to interfejsy funkcyjne, czyli interfejsy zawierające tylko jedną metodę (w przypadku "Consumer", jest to "accept").

Nazwa wzięła się ze słownictwa panującego w paradygmacie funkcyjnym - mamy konsumenta, czyli kogoś, kto tylko coś przyjmuje (pobiera wartości parametru) i nie zwraca żadnego wyniku (typ "void") ℹ️.

Finalnie rzecz ujmując, umieszczając typ "Consumer" w miejsce parametru metody, będziemy w stanie w momencie każdorazowego wywołania, zdefiniować jakie instrukcje mają się wykonać! Czyli jednego razu możemy chcieć wyświetlić komunikat, za innym razem zapisać dane i tak dalej. Takie cacko drastycznie podniesie poziom naszych możliwości (a na pewno zaplusuje podczas rozmowy kwalifikacyjnej) 🤩!

Przykład kodu źródłowego

Pokażę teraz na przykładzie prostej metody jak zaimplementować "Consumer" w języku Java. Mamy na przykład taką metodę typu "void" 👇:

public void doSomething() {
	
}

i chcemy do niej dodać konsumenta akceptującego parametr typu "String". Czyli najpierw patrzymy na nawiasy okrągłe i definiujemy niezbędne parametry:

public void doSomething(String string, Consumer consumer)

a wewnątrz ciała metody, wywołujemy sobie naszego konsumenta metodą "accept":

if(consumer != null) {
	consumer.accept(string);
}

Może zajść sytuacja, że sprzeciwimy się definicji "Consumer" w języku Java i wpiszemy wartość "null", dlatego musimy otoczyć nasze wywołanie sprawdzeniem instrukcją warunkową czy nie przyjmuje wartości "null" ⚠️.

Tak wygląda definicja. A jak ma wyglądać wywołanie takiej metody 👇? Może być tak:

doSomething("Mój łańcuch znaków", System.out::println);

Korzystam tutaj z referencji do metody, a ponieważ to też przyjmuje jeden parametr i operuję bezpośrednio na łańcuchu, mogę jak najbardziej napisać w ten sposób ✅. Może to też wyglądać tak:

doSomething("My sweet string", string -> System.out.println(string.length()));

albo tak:

launcher.doSomething("Jeszcze jeden łańcuch", string -> {
	System.out.println(string);
	System.out.println(string.toUpperCase());
});

albo jeszcze inaczej 😄! Właśnie to nam zapewnia "Consumer" w języku Java! Zachowuje się jak swego rodzaju "dysk wymienny", w którym zawieramy różne instrukcje, a urządzenie do którego je wkładamy, ze swojej strony tylko uruchamia ich wykonanie.

Możesz jak najbardziej połączyć "tradycyjne" wstawianie instrukcji z konsumentem ⭐:

public void doSomething(String string, Consumer consumer) {
	System.out.println("Rozpoczęcie obsługiwania podanego łańcucha");
	
	if(consumer != null) {
		consumer.accept(string);
	}
	
	System.out.println("Koniec obsługiwania podanego łańcucha");
}

a metoda sama w sobie nie musi być typu "void" ℹ️.

Kiedy użyć tego rodzaju, a kiedy innego? "Consumer" stosuj w chwili, gdy chcesz zawrzeć taki "dysk wymienny", który ma jedynie wykonać instrukcje (nie zwracać żadnej wartości) i przy którym masz pewność, że będzie potrzebować parametru. Ten parametr ustawiasz jaki chcesz na mocy typów generycznych.

Interfejs funkcyjny "Consumer" w języku Java

Interfejs funkcyjny "Consumer" umożliwia swobodne wstawianie definicji instrukcji jakie się mają wykonać w momencie wewnętrznego "uruchomienia" konsumenta w postaci wyrażenia lambda.


Wszystko. "Consumer" w języku Java jest jednym z wielu interfejsów funkcyjnych i omówimy sobie resztę w odrębnych artykułach.

NASTĘPNY ARTYKUŁ: Function w języku Java. Funkcja jako parametr metody

PODOBNE ARTYKUŁY