Omówienie interfejsów Consumer, Function, UnaryOperator #7

W tym wpisie zajmiemy się takimi interfejsami jak Consumer<T>, Function<T, R>, UnaryOperator<T>. Oczywiście są odmianami interfejsów opisanych w tym wpisie. Różnica między nimi jest taka, że działają na pojedynczych argumentach. Praktyki nigdy za mało, więć zaczynajmy!

1. Consumer<T>

Przed nami interfejs funkcjonalny Consumer<T>, jego zadanie jest proste. Przyjąć argument, wykonać operację i zakończyć pracę. Zobaczcie sami jak wygląda:

Na początek sprawdźmy co robi metoda accept. Wykorzystamy do tego pętlę forEach, która jak się okazuje może przyjąć jako argument obiekt typu Consumer. Tworzymy listę książek, potem wyrażenie lambda w oparciu o Consumera, którego zadaniem jest przyjąć obiekt i wypisać tytuł. Na końcu wywołujemy forEach na naszej liście i przekazujemy tam naszą lambdę.

Wynik:

Żeby zaprezentować andThen tworzymy jeszcze jedno wyrażenie lambda, które wydrukuje rodzaj okładki. Przekazujemy obydwa wyrażenia do pętli łącząc je za pomocą andThen. Najpierw wywoływane jest printTitle potem printCover na każdym obiekcie.

Wynik:

 

2. Function<T, R>

Function<T,R> przyjmuje argument i zwraca wynik. Zawiera klika metod deafult, które sobie także omówimy. Zobaczmy jak wygląda ten interfejs funkcjonalny:

Na początek metoda abstrakcyjna apply. Definiujemy wyrażenie lambda, którego zadaniem jest przetworzenie ceny do stringa. Funkcja przetwarza naszego doubla i zwraca już stringa, którego sobie drukujemy:

Wynik:

Następną metodą, jest metoda default compose. Przetwarza ona nasze wywołania nieco od tyłu. Najpierw wykorzystujemy lambdę zdefiniowaną wyżej. Zwraca nam cenę w postaci stringa, potem przesyłamy wynik do lambdy addString:

Wynik:

Metoda addThen działa na tych samych lambdach, które zdefiniowaliśmy wyżej. Przetwarza je w kolejności wywołania. Najpierw zwracana jest cena przez returnPrice, a potem doklejany string przez addString:

Wynik:

Ostatnia metoda to identity, która jest metodą statyczną. Jak wnioskujemy z opisu, zwraca ona przekazany do niej wynik. Możemy ją zdefiniować i wywołać tak:

To samo otrzymamy jeśli zrobimy to tak:

Wynik:

 

3. UnaryOperator<T>

Kolejny interfejs funkcjonalny UnaryOperator<T> rozszerza Function<T,T> tym samym przejmując jegoy metod. Wygląda tak:

Jak widzimy posiada własną implementację metody identity(). Ważną kwestią tego interfejsu jest to, że pracuje on zawsze na jednym typie obiektu. W interfejsie Function<T,T> mogliśmy zdefiniować lambdę operującą na obiekcie Book, która zwracała stringa. Tutaj tego nie możemy zrobić.

Lambda stworzona na UnaryOperator<T> zwraca ten sam typ obiektu. W tym przypadku tworzymy obiekt someBook. Tworzona lambda ma za zadanie zwrócić kopię tego obiektu.

Wynik:

Pamiętajcie, że wszystkie przykłady umieszczone są na githubie.

 

3 thoughts on “Omówienie interfejsów Consumer, Function, UnaryOperator #7

  1. Pingback: Pozostałe interfejsy funkcjonalne #9 – Zacznij Programować – To proste, ale musisz zacząć, a ta strona Ci w tym pomoże :)

  2. Pingback: Stream i użycia map oraz flatMap – Zacznij Programować – To proste, ale musisz zacząć, a ta strona Ci w tym pomoże :)

  3. killer

    Hej,
    w przykładzie z Function.identity(); powinno byc:
    System.out.println(returnBook.apply(book1)); // czyli returnBook zamiast returnBook2

    Reply

Dodaj komentarz

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