Zastanawiam się, czy istnieje preferowany sposób przejścia ze strumienia list do kolekcji zawierającej elementy wszystkich list w strumieniu. mogę myśleć dwa sposoby, aby tam dostać:Czy istnieje preferowany sposób pobierania strumienia list do listy płaskiej?
final Stream<List<Integer>> stream = Stream.empty();
final List<Integer> one = stream.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
final List<Integer> two = stream.flatMap(List::stream).collect(Collectors.toList());
Druga opcja wygląda o wiele ładniejszy do mnie, ale myślę, że pierwszy z nich jest bardziej wydajny w równoległych strumieni. Czy istnieją dalsze argumenty za lub przeciw jednej z dwóch metod?
Czy mógłbyś wyjaśnić, dlaczego pierwsza wersja nie działałaby dobrze w równoległym strumieniu? Operacje pośrednie przed zbieraniem mogą być wykonywane równolegle i kilka ArrayLists może być utrzymanych za pomocą funkcji akumulatora (drugi parametr zbierania). Następnie łącznik (trzeci parametr) zostanie użyty do zebrania wszystkich elementów w jedną dużą ArrayList. (W tym przypadku obie funkcje będą oczywiście takie same, ale użyte w inny sposób). – muued
Równoległość jest taka sama w obu wersjach w odniesieniu do przetwarzania ** 'Stream' **, czyli * zewnętrznego * strumienia. Ale w drugiej wersji spłaszczony strumień składa się z elementów ** listy dodatkowej **, która pozwala na dzielenie operacji w środku podlist, jeśli jest to wykonalne. Jest to niemożliwe w pierwszej wersji. Jak już wspomniano, jest to istotne tylko wtedy, gdy strumień składa się z kilku raczej dużych podlist (i jeśli różnią się one rozmiarem). Ponieważ nie masz pośrednich operacji między 'flatMap' i' collect', wpływa to tylko na 'collect', więc różnica może być bardzo mała. – Holger
W porządku, jeśli były niezbędne operacje pomiędzy 'flatMap' i' collect', zdecydowanie nie należy używać pierwszej wersji. Nie brałem tego pod uwagę. Dzięki za odpowiedź – muued