Wie konvertiert man einen Java 8 Stream in ein Array?


459

Was ist der einfachste/kürzeste Weg, ein Java 8 Stream in ein Array zu konvertieren?

+2

Ich würde Ihnen vorschlagen, das Rollback als die Frage mehr vollständig war zurückkehren und zeigte man etwas versucht hatte. 15 apr. 142014-04-15 09:13:21

  0

@skiwi Danke! aber ich dachte, dass der versuchte Code nicht wirklich mehr Informationen zu der Frage hinzufügt, und niemand hat geschrien "zeig uns deinen Versuch" doch =) 15 apr. 142014-04-15 09:20:32

+12

@skiwi: Obwohl ich normalerweise an den Do-my-Hausaufgaben-statt-von-mir schreie Fragen, diese spezielle Frage scheint mir ohne zusätzliche Unordnung klarer zu sein. Lass es uns ordentlich machen. 16 apr. 142014-04-16 11:21:24

692

Die einfachste Methode besteht darin, die toArray(IntFunction<A[]> generator)-Methode mit einer Array-Konstruktorreferenz zu verwenden. Dies wird in der API documentation for the method vorgeschlagen.

String[] stringArray = streamString.toArray(String[]::new); 

Was sie tut, ist es, ein Verfahren finden, das in einer ganzen Zahl (die Größe) als Argument und gibt ein String[], das ist genau, was ist (einer der Überlastung von) new String[] tut.

Sie können auch Ihre eigenen schreiben IntFunction:

Stream<String> stream = ...; 
String[] stringArray = stream.toArray(size -> new String[size]); 

Der Zweck des IntFunction<A[]> generator ist eine ganze Zahl zu konvertieren, um die Größe des Arrays in ein neues Array.

Beispielcode:

Stream<String> streamString = Stream.of("a", "b", "c"); 
String[] stringArray = streamString.toArray(size -> new String[size]); 
Arrays.stream(stringArray).forEach(System.out::println); 

Drucke:

a 
b 
c 
+176

'String [] :: new' ist ein guter Trick; einfacher als ein Lambda-Ausdruck, meiner Meinung nach. 18 dez. 142014-12-18 07:55:54

+11

Zenexer hat Recht, die Lösung sollte sein: 'stream.toArray (String [] :: neu);' 01 okt. 152015-10-01 13:01:08

+4

und hier ist eine Erklärung, warum und wie die Array-Konstruktorreferenz tatsächlich funktionieren: http://stackoverflow.com/ Fragen/29447561/How-Do-Java-8-Array-Konstruktor-Referenzen-Arbeit 12 sep. 162016-09-12 18:16:38

  0

* "Zenexer hat Recht, sollte die Lösung sein: stream.toArray (String [] :: neu);" * ... Nun gut , aber man sollte verstehen, dass die Methodenreferenz logisch und funktionell äquivalent zu toArray (sz -> new String [sz]) ist. Ich bin also nicht sicher, ob man wirklich sagen kann, was die Lösung sein soll oder muss. 20 apr. 172017-04-20 14:16:02

  0

Die Array-Konstruktorreferenz ist präziser. Die Dokumentation für die 'toArray()' Methode zitiert ihre Prägnanz und schließt ihre Verwendung im einzigen Beispiel ein. Als es am Ende der Antwort geheftet wurde, habe ich es bei der ersten Lesung verpasst. Es wurde über die Details nach oben verschoben, damit niemand es vermisst. 01 mai. 172017-05-01 19:44:05

+2

@scottb 'sz -> new String [sz]' macht eine neue Funktion, wo die Konstruktorreferenz nicht funktioniert. Es hängt davon ab, wie viel Wert auf Garbage Collection Churn gelegt wird. 18 aug. 172017-08-18 09:19:42

+1

@WORMSS Es tut es nicht. Es macht (statisch!) Eine neue, 'private' * Methode *, die keine Abwanderung verursachen kann, und * beide * Versionen müssen ein neues Objekt erstellen. Ein Verweis erstellt ein Objekt, das direkt auf die Zielmethode zeigt. Ein Lambda erzeugt ein Objekt, das auf das erzeugte "private" zeigt. Ein Verweis auf einen Konstruktor sollte immer noch besser funktionieren, wenn es an Indirektion und VM-Optimierung mangelt, aber das Problem hat nichts damit zu tun. 29 okt. 172017-10-29 23:54:01

  0

@HTNW Sie sind richtig, meine Entschuldigung. Es war eigentlich mein Versuch zu debuggen, der die Abwanderung verursachte, die die Abwanderung verursachte, als ich das zum ersten Mal versuchte, also hatte ich es in meinem Kopf fest, dass es so war. (Hasse es, wenn das passiert). 30 okt. 172017-10-30 08:38:59


17

Wenn Sie ein Array von ints erhalten möchten, mit Werten Form 1 bis 10, von einem Bach, ist es IntStream zur Verfügung .

Hier erstellen wir einen Stream mit einer Stream.of-Methode und konvertieren einen Stream mit einem mapToInt in einen IntStream. Dann können wir die toArray-Methode von IntStream aufrufen.

Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10); 
//or use this to create our stream 
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed(); 
int[] array = stream.mapToInt(x -> x).toArray(); 

Dies ist die gleiche Sache, ohne Strom, nur mit dem IntStream

int[]array2 = IntStream.rangeClosed(1, 10).toArray(); 

2

Sie können eine benutzerdefinierte Collector erstellen, die einen Stream Array konvertieren.

public static <T> Collector<T, ?, T[]> toArray(IntFunction<T[]> converter) 
{ 
    return Collectors.collectingAndThen( 
        Collectors.toList(), 
        list ->list.toArray(converter.apply(list.size()))); 
} 

und eine schnelle Verwendung

List<String> input = Arrays.asList(.....); 

String[] result = input.stream(). 
     .collect(CustomCollectors.**toArray**(String[]::new)); 

0
 Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6); 

    Integer[] integers = stream.toArray(it->new Integer[it]); 

0

Sie einen dieser einfachen Codeblock Java 8 Strom in ein Array umwandeln kann mit:

String[] myNewArray3 = myNewStream.toArray(String[]::new); 

Aber lassen Sie uns die Dinge erklären mehr, Zuerst erstellen wir eine Liste von Strings, die mit drei Werten gefüllt sind:

String[] stringList = {"Bachiri","Taoufiq","Abderrahman"}; 

einen Strom aus dem angegebenen Array erstellen:

Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase()); 

und schließlich wandelt es in ein Java-8-Array mit diesen Methoden:

Stream<String> stringStream = Arrays.stream(stringList); 

wir jetzt einige Operationen auf diesem Strom Ex ausführen kann :

1-klassische Methode (Functional-Schnittstelle)

IntFunction<String[]> intFunction = new IntFunction<String[]>() { 
    @Override 
    public String[] apply(int value) { 
     return new String[value]; 
    } 
}; 


String[] myNewArray = myNewStream.toArray(intFunction); 

2 -Lambda Ausdruck

String[] myNewArray2 = myNewStream.toArray(value -> new String[value]); 

3- Methodenreferenz

String[] myNewArray3 = myNewStream.toArray(String[]::new); 

Methodenreferenz Erläuterung:

Es ist ein weiterer Weg, um einen Lambda-Ausdruck zu schreiben, dass es auf den anderen strikt äquivalent ist.


2

Die Verwendung der toArray(IntFunction<A[]> generator) Methode ist in der Tat eine sehr elegante und sichere Möglichkeit, einen Stream in ein Array des gleichen Typs des Streams zu konvertieren (oder genauer zu sammeln).

Wenn jedoch der Typ des zurückgegebenen Arrays nicht wichtig ist, einfach mit der toArray() Methode ist sowohl einfacher und kürzer. Zum Beispiel:

Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3); 
    System.out.printf("%s, %s, %s!", args.toArray());