A menudo, es posible que deba realizar una concatenación o fusionar dos flujos. En la clase Stream, hay un método estático concat () que se puede usar para este propósito.
Fusionar dos corrientes
String[] arr1 = { "a", "b", "c", "d" }; String[] arr2 = { "e", "f", "g" }; Stream<String> stream1 = Stream.of(arr1); Stream<String> stream2 = Stream.of(arr2); Stream<String> stream3 = Stream.concat(stream1, stream2); String[] arr = stream3.toArray(String[]::new); System.out.println(Arrays.toString(arr)); |
Producción:
[a, b, c, d, e, f, g]
Fusionar una secuencia filtrada con otra
Si necesita filtrar una secuencia antes de realizar la concatenación con otra secuencia:
String[] arr1 = { "abc", "bcd", "cdef", "defgh" }; String[] arr2 = { "af", "fg", "gh" }; Stream<String> stream1 = Stream.of(arr1); Stream<String> stream2 = Stream.of(arr2); Stream<String> stream3 = Stream.concat(stream1.filter(x -> x.length()<4), stream2); String[] arr = stream3.toArray(String[]::new); System.out.println(Arrays.toString(arr)); |
Producción:
[abc, bcd, af, fg, gh]
Fusión de más de 2 corrientes
String[] arr1 = { "a", "b", "c", "d" }; String[] arr2 = { "e", "f", "g" }; String[] arr3 = { "h", "i", "j" }; Stream<String> stream1 = Stream.of(arr1); Stream<String> stream2 = Stream.of(arr2); Stream<String> stream3 = Stream.of(arr3); Stream<String> stream = Stream.concat(Stream.concat(stream1, stream2), stream3); String[] arr = stream.toArray(String[]::new); System.out.println(Arrays.toString(arr)); |
Producción:
[a, b, c, d, e, f, g, h, i, j]
Tenga en cuenta que los elementos devueltos por el método Stream.concat () están ordenados. Por ejemplo, las siguientes dos líneas devuelven el mismo resultado:
Stream.concat(Stream.concat(stream1, stream2), stream3); Stream.concat(stream1, Stream.concat(stream2, stream3)); |
Pero el resultado de los dos siguientes es diferente.
Stream.concat(Stream.concat(stream1, stream2), stream3); //[a, b, c, d, e, f, g, h, i, j] Stream.concat(Stream.concat(stream2, stream1), stream3); //[e, f, g, a, b, c, d, h, i, j] |
Utilice Stream.of (…). FlatMap () para fusionar
Para que el código sea más legible, también puede usar el método Stream.of () para fusionar más de dos flujos.
String[] arr1 = { "a", "b", "c", "d" }; String[] arr2 = { "e", "f", "g" }; String[] arr3 = { "h", "i", "j" }; Stream<String> stream1 = Stream.of(arr1); Stream<String> stream2 = Stream.of(arr2); Stream<String> stream3 = Stream.of(arr3); //use Stream.of(T... values) Stream<String> stream = Stream.of(stream1, stream2, stream3).flatMap(x -> x); String[] arr = stream.toArray(String[]::new); System.out.println(Arrays.toString(arr)); |