Wyrażenia lambda

Czym są wyrażenia lambda

Wyrażenia lambda w Javie mogą być stosowane w miejscach, w których oczekiwany jest argument typu będącego interfejsem funkcyjnym. Brzmi to skomplikowanie, ale najprościej wytłumaczyć to na przykładzie. Załóżmy, że chcemy posortować pewną kolekcję:

List<String> names = Arrays.asList("Kasia", "Ania", "Zosia", "Bartek");

Możemy w tym celu wykorzystać metodę sort() klasy Collections. Przyjmuje ona jako argumenty kolekcję do posortowania i komparator ustalający porządek:

Collections.sort(names, new Comparator<String>() {
  	@Override
  	public int compare(String o1, String o2) {
  		return o1.compareToIgnoreCase(o2);
  	}
  });

Zapis taki jest trochę mało czytelny przez wykorzystanie klasy anonimowej. Interfejs Comparator jest jednak interfejsem funkcyjnym, posiada tylko jedną metodę abstrakcyjną compare(o1, o2) więc możemy sobie wyobrazić go jako funkcję, która przyjmuje dwa parametry i zwraca wartość typu int:

(String o1, String o2) -> int

W miejsce komparatora możemy więc wstawić wyrażenie lambda, które odpowiada sygnaturze takiej funkcji, np.:

(String s1, String s2) -> s1.compareToIgnoreCase(s2)

Kompilator jest w stanie w większości przypadków domyślić się typu argumentów na podstawie kontekstu, więc w rzeczywistości posłużyć się krótszym zapisem:

(s1, s2) -> s1.compareToIgnoreCase(s2)

Kurs Java

Przykłady

package pl.javastart;
  
  import java.util.Arrays;
  import java.util.Collections;
  import java.util.List;
  
  public class ComparatorLambdaExample {
  	public static void main(String[] args) {
  		List<String> names = Arrays.asList("Kasia", "Ania", "Zosia", "Bartek");
  		//sortowanie aldabetyczne z uwzględnieniem wielkości liter
  		Collections.sort(names, (s1, s2) -> s1.compareToIgnoreCase(s2));
  		//metoda dorEach od Jav8 8 daje możliwości jak pętla for-each
  		//oczekuje argumentu typu java.util.function.Consumer, czyli
  		// (arg) -> void
  		names.forEach(arg -> System.out.println(arg));
  	}
  }
przykład lambda

Przykład na Github


Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.