Niedawno opanowałem wyrażenie Lambda, które zostało wprowadzone w java 8. Odkryłem, że ilekroć używam funkcjonalnego interfejsu, zwykle używam wyrażenia Lambda zamiast tworzyć klasę, która implementuje funkcjonalny interfejs.
Czy jest to uważane za dobrą praktykę? A może ich sytuacje, w których użycie Lambdy jako funkcjonalnego interfejsu jest nieodpowiednie?
Odpowiedzi:
Istnieje wiele kryteriów, które powinny skłonić Cię do rozważenia niestosowania lambda:
priceIsOver100
.x -> x.price > 100
jest tak samo jasne jak ta nazwa. Mam na myśli,isEligibleVoter
że takie imiona zastępują długą listę warunków.Nie idź za burtę. Pamiętaj, że oprogramowanie można łatwo zmienić. W razie wątpliwości napisz to w obie strony i sprawdź, który z nich jest łatwiejszy do odczytania.
źródło
To zależy. Ilekroć znajdziesz tę samą lambdę w różnych miejscach, powinieneś rozważyć wdrożenie klasy, która implementuje interfejs. Ale gdybyś użył anonimowej klasy wewnętrznej, inaczej uważam, że lambda jest znacznie lepsza.
źródło
Popieram odpowiedź Karla Bielefeldta, ale chcę przedstawić krótkie uzupełnienie.
źródło
Dostęp do zmiennych lokalnych obejmującego zakres
Przyjęta odpowiedź Karla Bielefeldta jest poprawna. Mogę dodać jeszcze jedno rozróżnienie:
Kod lambda zagnieżdżony w metodzie wewnątrz klasy może uzyskiwać dostęp do dowolnie efektywnych zmiennych końcowych znalezionych w tej metodzie i klasie.
Utworzenie klasy, która implementuje funkcjonalny interfejs, nie daje takiego bezpośredniego dostępu do stanu kodu wywołującego.
Aby zacytować Java Tutorial (podkreślenie moje):
Chociaż wyciąganie długiego kodu i nazywanie go ma wiele zalet, należy to porównać z prostotą bezpośredniego dostępu do stanu otaczającej metody i klasy.
Widzieć:
źródło
Może to być wybieranie nitów, ale do wszystkich innych doskonałych punktów zawartych w innych odpowiedziach dodałbym:
Preferuj referencje metod, jeśli to możliwe. Porównać:
przeciw
Użycie odwołania do metody pozwala uniknąć konieczności nazwania argumentów lambdy, które zwykle są zbędne i / lub prowadzą do leniwych nazw, takich jak
e
lubx
.źródło
Opierając się na odpowiedzi Matta McHenry'ego, może istnieć związek między lambda a referencjami metod, przy czym lambda może być przepisana jako seria referencji metod. Na przykład:
vs
źródło