for (Canvas canvas : list) {
}
NetBeans sugeruje użycie „operacji funkcjonalnych”:
list.stream().forEach((canvas) -> {
});
Ale dlaczego jest to preferowane ? Jeśli tak, to trudniej jest je przeczytać i zrozumieć. Dzwonisz stream()
, a następnie forEach()
używasz wyrażenia lambda z parametrem canvas
. Nie rozumiem, jak to jest ładniejsze niż for
pętla w pierwszym fragmencie.
Oczywiście mówię tylko z estetyki. Być może brakuje mi tutaj przewagi technicznej. Co to jest? Dlaczego zamiast tego powinienem użyć drugiej metody?
java
lambda
java8
stream-processing
Omega
źródło
źródło
Odpowiedzi:
Strumienie zapewniają znacznie lepszą abstrakcję dla kompozycji różnych operacji, które chcesz wykonywać na podstawie kolekcji lub strumieni danych, które nadchodzą. Zwłaszcza, gdy trzeba mapować elementy, filtrować je i konwertować.
Twój przykład nie jest zbyt praktyczny. Rozważ następujący kod z witryny Oracle .
można zapisać za pomocą strumieni:
Druga opcja jest znacznie bardziej czytelna. Więc kiedy zagnieżdżasz pętle lub różne pętle wykonujące częściowe przetwarzanie, jest to bardzo dobry kandydat do użycia interfejsu API Streams / Lambda.
źródło
stream.map(f).map(g)
≡stream.map(f.andThen(g))
) budowanie / zmniejszanie fuzji (podczas budowania strumienia w jednej metodzie, a następnie przekazanie go do innej metody, która go zużywa, kompilator może wyeliminować strumień) i fuzji strumienia (która może łączyć wiele operacji strumienia razem w jedną pętlę imperatywną), co może znacznie zwiększyć wydajność operacji strumieniowych. Są one zaimplementowane w kompilatorze GHC Haskell, a także w niektórych innych kompilatorach języka Haskell i innych językach funkcjonalnych. Istnieją także implementacje badań eksperymentalnych dla Scali.Kolejną zaletą korzystania z funkcjonalnego API przesyłania strumieniowego jest to, że ukrywa on szczegóły implementacji. Opisuje tylko, co należy zrobić, a nie jak. Ta zaleta staje się oczywista, gdy przyjrzymy się zmianom, które należy wprowadzić, aby zmienić z jednowątkowego na równoległe wykonywanie kodu. Wystarczy zmienić
.stream()
się.parallelStream()
.źródło
To jest bardzo subiektywne. Uważam, że druga wersja jest znacznie łatwiejsza do odczytania i zrozumienia. Pasuje do tego, jak robią to inne języki (np. Ruby, Smalltalk, Clojure, Io, Ioke, Seph), wymaga mniej pojęć do zrozumienia (jest to zwykłe wywołanie metody, jak każdy inny, podczas gdy pierwszy przykład to specjalistyczna składnia).
Jeśli już, to kwestia znajomości.
źródło