Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 6
  • 369

Witajcie, wraz z wersją 8 Javy dostaliśmy możliwość używania wyrażeń Lambda. Orientuję się, czym są i jaka jest składnia, np. użyte jako argument w wywołaniu funkcji:

 

printPersons(
    roster,
    (Person p) -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25
);

 

Proszę o przykłady zastosowań i sytuacji, w jakich takie wyrażenia są wygodniejsze od tradycyjnego podejścia.

Maciej_Krauze
  • Zapytał
  • @ Maciej_Krauze | 03.02.2015
    • lider
    • laureat
    • 45
    • 16
    • 58

Odpowiedzi (2)

  • 9

Wyrażenia lambda upraszczają kod i czynią go bardziej przejrzystym, wszędzie tam, gdzie dotychczas wykorzystywaliśmy interfejsy funkcyjne (definiujące pojedynczą metodę).

Dobrym przykładem jest zastosowanie delegacji. Dotychczas brakowało w Javie czegoś w rodzaju wskaźnika do funkcji (takiego jak w C), aby do jakiejś metody "wstrzyknąć" kod. Obejściem tego problemu było przekazanie metodzie argumentu typu interfejsu (funkcyjnego). Ponieważ możemy mieć wiele implementacji tego samego interfejsu, więc do metody można przekazać obiekty z różnymi realizacjami metody interfejsu.

Tego rodzaju pomocniczych interfejsów jest w Javie wiele, np.:

  • Runnable - wykorzystywany do przekazania zadania do wątka (instancji Thread)
  • Comparable czy Comparator - służący do określenia sposobu sortowania obiektów
  • ActionListener - określający kod obsługi zdarzenia akcji
  • itd.
  • Odpowiedział
  • @ | 03.02.2015
  • TRENER MODERATOR ALTKOM AKADEMII
  • 9

Stosując nową składnie z wersji 8 Javy uprościć niektóre często stosowane operacje. Oto kilka przykładów:

Przy obsłudze zdarzenia w swingu dla przycisku, zamiast wywołania:
 
    button.addActionListener(
        new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            methodToInvoke();
        }
    });
 
można to wyrazić za pomocą nowej składni:
 
    button.addActionListener(e -> methodToInvoke());

Podcza operacji sortowania z użyciem comparatora dla przykładowej testowej tablicy 'testStrings', wywołanie operacji:

 String[] testStrings ={"one", "two", "three", "four"};:
    Arrays.sort(testStrings, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return(s1.length() - s2.length());
        }
    });

 można zastąpić wywołaniem:
 
    Arrays.sort(testStrings,
        (String s1, String s2) -> { return(s1.length() – s2.length());
    });

Ogólna zasada umożliwia nam przeksztłcanie kodu z postaci:

    new SomeInterface() {
        @Override
        public SomeType someMethod(T1 v1, T2 v2) {
            return(someValue);
        }
    }
Do uproszczonej wersji:

    (v1, v2) -> someValue
 
Takie przekształcanie możliwe jest tylko dla interfejsów posiadających jedną metodę. Oznaczenie interfejsu adnotacją @FunctionalInterface umożliwia wychwycenie błędu podczas kompilacji kodu.

  • Odpowiedział
  • @ | 10.02.2015
  • TRENER ALTKOM AKADEMII
Komentarze
Dziękuję panie Pawle, te przykłady wiele mi wyjaśniły.
Skomentował : @ Maciej_Krauze ,10.02.2015
  • 45
  • 16
  • 58