Was ist der einfachste/kürzeste Weg, um ein Java 8 Stream
in ein Array zu konvertieren?
Die einfachste Methode ist die Verwendung der toArray(IntFunction<A[]> generator)
-Methode mit einer Array-Konstruktorreferenz. Dies wird in der API-Dokumentation für die Methode vorgeschlagen.
String[] stringArray = stringStream.toArray(String[]::new);
Es wird eine Methode gefunden, die eine Ganzzahl (die Größe) als Argument aufnimmt und einen String[]
zurückgibt. Genau das macht (eine der Überladungen von) new String[]
.
Sie können auch Ihr eigenes IntFunction
schreiben:
Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);
Der Zweck von IntFunction<A[]> generator
besteht darin, eine Ganzzahl, die Größe des Arrays, in ein neues Array umzuwandeln.
Beispielcode:
Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);
Drucke:
a
b
c
Wenn Sie ein Array von Ints mit Werten von 1 bis 10 aus einem Stream abrufen möchten, steht Ihnen IntStream zur Verfügung.
Hier erstellen wir einen Stream mit einer Stream.of-Methode und konvertieren einen Stream mit mapToInt in einen IntStream. Dann können wir IntStreams toArray-Methode 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();
Hier ist dasselbe, ohne den Stream, nur mit dem IntStream
int[]array2 = IntStream.rangeClosed(1, 10).toArray();
Mit diesem einfachen Codeblock können Sie einen Stream Java 8 in ein Array konvertieren:
String[] myNewArray3 = myNewStream.toArray(String[]::new);
Aber lassen Sie uns die Dinge noch näher erläutern. Zuerst erstellen wir eine Liste mit Zeichenfolgen, die mit drei Werten gefüllt sind:
String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};
Erstellen Sie einen Stream aus dem angegebenen Array:
Stream<String> stringStream = Arrays.stream(stringList);
wir können nun einige Operationen an diesem Stream ausführen. Beispiel:
Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());
und konvertieren Sie es schließlich mit den folgenden Methoden in ein Java 8-Array:
1-klassische Methode (funktionale 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 eine andere Art, einen Lambda-Ausdruck zu schreiben, der dem anderen genau gleichwertig ist.
Konvertieren Sie Text in ein String-Array, in dem jeder Wert durch Komma getrennt wird, und schneiden Sie jedes Feld ab. Beispiel:
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
Sie können einen benutzerdefinierten Collector erstellen, der einen Stream in ein Array konvertiert.
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 ) );
Die Verwendung der toArray(IntFunction<A[]> generator)
-Methode ist in der Tat eine sehr elegante und sichere Methode, um einen Stream in ein Array des gleichen Stream-Typs zu konvertieren (oder genauer gesagt, zu sammeln).
Wenn der Typ des zurückgegebenen Arrays jedoch nicht wichtig ist, ist es einfacher, die toArray()
-Methode zu verwenden nd kürzer. Zum Beispiel:
Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
System.out.printf("%s, %s, %s!", args.toArray());
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
int[] arr= stream.mapToInt(x->x.intValue()).toArray();