Jaki jest najłatwiejszy / najkrótszy sposób na konwersję Java 8 Stream
na tablicę?
java
arrays
java-8
java-stream
MC Emperor
źródło
źródło
Odpowiedzi:
Najłatwiejszą metodą jest użycie
toArray(IntFunction<A[]> generator)
metody z referencją do konstruktora tablic. Jest to sugerowane w dokumentacji interfejsu API dla tej metody .To, co robi, to znalezienie metody, która przyjmuje liczbę całkowitą (rozmiar) jako argument i zwraca a
String[]
, czyli dokładnie to, co robi (jedno z przeciążeń)new String[]
.Możesz także napisać własny
IntFunction
:Celem tego
IntFunction<A[]> generator
jest przekonwertowanie liczby całkowitej, rozmiaru tablicy, na nową tablicę.Przykładowy kod:
Wydruki:
źródło
toArray(sz -> new String[sz])
więc nie jestem pewien, czy naprawdę można powiedzieć, jakie rozwiązanie powinno lub musi być.sz -> new String[sz]
wprowadza nową funkcję, w której nie ma odwołania do konstruktora. To zależy od tego, jak bardzo cenisz śmieciowanie śmieci.private
metodę , która nie może powodować rezygnacji, i obie wersje muszą utworzyć nowy obiekt. Odwołanie tworzy obiekt, który wskazuje bezpośrednio na metodę docelową; lambda tworzy obiekt wskazujący na wygenerowanyprivate
. Odwołanie do konstruktora powinno nadal działać lepiej ze względu na brak pośrednictwa i łatwiejszą optymalizację maszyn wirtualnych, ale ubijanie nie ma z tym nic wspólnego.Jeśli chcesz uzyskać tablicę liczb całkowitych o wartościach od 1 do 10 ze strumienia, masz do dyspozycji IntStream.
Tutaj tworzymy strumień metodą Stream.of i konwertujemy strumień do IntStream za pomocą mapToInt. Następnie możemy wywołać metodę toArray IntStream.
Oto to samo, bez Strumienia, używając tylko IntStream
źródło
Możesz przekonwertować strumień Java 8 na tablicę za pomocą tego prostego bloku kodu:
Ale wyjaśnijmy więcej, najpierw stwórzmy listę łańcuchów wypełnionych trzema wartościami:
Utwórz strumień z podanej tablicy:
możemy teraz wykonać niektóre operacje na tym strumieniu. Przykład:
i na koniec przekonwertować go na java 8 Array przy użyciu następujących metod:
Metoda 1-klasyczna (interfejs funkcjonalny)
2-wyrażenie lambda
3- Odniesienie do metody
Odwołanie do metody Objaśnienie:
Jest to inny sposób pisania wyrażenia lambda, który jest ściśle równoważny z drugim.
źródło
Konwertuj tekst na tablicę łańcuchów, gdzie oddzielamy każdą wartość przecinkiem, i przycinaj wszystkie pola, na przykład:
źródło
Możesz utworzyć niestandardowy moduł zbierający, który konwertuje strumień na tablicę.
i szybkie użycie
źródło
Collectors.groupingBy
aby móc mapować niektóre atrybuty na tablice obiektów według wartości atrybutu. Ta odpowiedź daje mi dokładnie to. Również @DidierL.Używając
toArray(IntFunction<A[]> generator)
metody jest w rzeczywistości bardzo eleganckim i bezpiecznym sposobem konwersji (lub, bardziej poprawnie, zbierania) Strumienia na tablicę tego samego typu Strumienia.Jeśli jednak typ zwracanej tablicy nie jest ważny, po prostu użycie
toArray()
metody jest zarówno łatwiejsze, jak i krótsze. Na przykład:źródło
źródło
Wypróbuj online: https://repl.it/@SmaMa/Stream-to-array
źródło
źródło
Możesz to zrobić na kilka sposobów: wszystkie są technicznie takie same, ale użycie Lambdy uprościłoby część kodu. Powiedzmy, że najpierw inicjujemy Listę ciągiem, nazywamy ją osobami.
Teraz możesz użyć jednego z następujących sposobów.
Użycie Lambda Expresiion do utworzenia nowego StringArray o zdefiniowanym rozmiarze.
String [] stringArray = stream.toArray (size-> new String [size]);
Bezpośrednie użycie metody
String [] stringArray = stream.toArray (String [] :: new);
źródło