widzę wiele przykładów, gdzie na przykładJaka jest konwencja dla nazw zmiennych w wyrażeniach lambda?
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
możemy wykorzystać dowolną variableName w tych wyrażeń lambda?
Uważam, że nazwy zmiennych mają konwencje i dobrze jest używać nazw własnych dla czytelności.
Na przykład, jeśli używam w jako Widget w pre-java8, kod zostanie odrzucony jako nieczytelny. Co się zmieniło wraz z nadejściem java 8?
for(Widget w : widgets)
{
if(w.getColor() == RED) {
sum += w.getWeight();
}
}
Dlaczego nie może być napisany kod tak:
int sum = widgets.stream()
.filter(widget -> widget.getColor() == RED)
.mapToInt(widget -> widget.getWeight())
.sum();
Może powyższy kod robi coś prosto do przodu, a jedynie na widget na liście widżetów. Więc coś więcej:
Który jest lepiej czytelny:
return requestHolder.getRequests()
.stream()
.map(request -> request.getErrorHolder())
.flatMap(errorData -> errorData.getErrors().stream())
.collect(toList());
lub
return requestHolder.getRequests()
.stream()
.map(t -> t.getErrorHolder())
.flatMap(r -> r.getErrors().stream())
.collect(toList());
Może ja czegoś brakuje. Czy możesz wytłumaczyć?
Za to, co jest warte, nie widzę niczego złego w używaniu 'w' jako nazwy zmiennej w pętli foreach. Jest zupełnie jasne, co to jest i dlaczego tam jest. To tak, jak użycie 'i' jako licznika w pętli' for'. –
Metoda taka jak 'map' pobiera element _each_ i konwertuje go. Nie ma znaczenia, co nazywasz odniesieniem do obiektu. –
Zgadzam się, że to jak użycie 'i' jako licznika pętli, ale mogą być sytuacje w lambdzie, gdzie nie jest jasne, do czego odnosi się krótka nazwa, i użycie dłuższej nazwy byłoby pomocne. – ajb