Convertendo entre fluxo e matriz em Java
1. Introdução
É comum precisar deconvert váriosdynamic data structures emarrays.
Neste tutorial, vamos demonstrar como converter umStream em um array e vice-versa em Java.
2. Convertendo umStream em um Array
2.1. Referência do método
A melhor maneira de converterStream em uma matriz é usar o métodoStream'stoArray():
public String[] usingMethodReference(Stream stringStream) {
return stringStream.toArray(String[]::new);
}
Agora, podemos testar facilmente se a conversão foi bem-sucedida:
Stream stringStream = Stream.of("example", "convert", "to", "string", "array");
assertArrayEquals(new String[] { "example", "convert", "to", "string", "array" },
usingMethodReference(stringStream));
2.2. Expressão Lambda
Outro equivalente épass a lambda expression ao métodotoArray ():
public static String[] usingLambda(Stream stringStream) {
return stringStream.toArray(size -> new String[size]);
}
Isso nos daria o mesmo resultado que o uso da referência de método.
2.3. Classe personalizada
Ou, podemos fazer tudo e criar uma classe completa.
Como podemos ver emthe Stream documentation, leva umIntFunction como argumento. Ele pega o tamanho da matriz como entrada e retorna uma matriz desse tamanho.
Claro,IntFunction é uma interface para que possamos implementá-la:
class MyArrayFunction implements IntFunction {
@Override
public String[] apply(int size) {
return new String[size];
}
};
Podemos então construir e usar normalmente:
public String[] usingCustomClass(Stream stringStream) {
return stringStream.toArray(new MyArrayFunction());
}
Consequentemente, podemos fazer a mesma afirmação anterior.
2.4. Matrizes primitivas
Nas seções anteriores, exploramos como converter um arrayString Stream em um arrayString. Na verdade, podemos realizar a conversão dessa forma para qualquerObjecte seria muito semelhante aos exemplosString acima.
No entanto, é um pouco diferente para os primitivos. Se tivermos umStream deIntegers que queremos converter emint[], por exemplo, primeiro precisamos chamar o métodomapToInt():
public int[] intStreamToPrimitiveIntArray(Stream integerStream) {
return integerStream.mapToInt(i -> i).toArray();
}
Também há métodosmapToLong()emapToDouble() à nossa disposição. Além disso, observe que não passamos nenhum argumento paratoArray() desta vez.
Finalmente, vamos fazer a asserção de igualdade e confirmar se obtivemos nossa matrizint corretamente:
Stream integerStream = IntStream.rangeClosed(1, 7).boxed();
assertArrayEquals(new int[]{1, 2, 3, 4, 5, 6, 7}, intStreamToPrimitiveIntArray(integerStream));
E se precisarmos fazer o oposto? Vamos dar uma olhada.
3. Convertendo um Array em umStream
É claro que também podemos seguir o outro caminho. E o Java tem alguns métodos dedicados para isso.
3.1. Matriz deObjects
We can convert the array to a Stream using Arrays.stream() or Stream.of() methods:
public Stream stringArrayToStreamUsingArraysStream(String[] stringArray) {
return Arrays.stream(stringArray);
}
public Stream stringArrayToStreamUsingStreamOf(String[] stringArray) {
return Stream.of(stringArray);
}
Devemos notar que em ambos os casos, nossoStream é igual ao nosso array.
3.2. Matriz de primitivos
Da mesma forma, podemos converter uma matriz de primitivas:
public IntStream primitiveIntArrayToStreamUsingArraysStream(int[] intArray) {
return Arrays.stream(intArray);
}
public Stream primitiveIntArrayToStreamUsingStreamOf(int[] intArray) {
return Stream.of(intArray);
}
Mas, em contraste com a conversão de matrizesObjects, há uma diferença importante. When converting primitives array, Arrays.stream() returns IntStream, while Stream.of() returns Stream<int[]>.
3.3. Arrays.stream vs. Stream.of
Para entender as diferenças mencionadas nas seções anteriores, daremos uma olhada na implementação dos métodos correspondentes.
Vamos primeiro dar uma olhada na implementação de Java desses dois métodos:
public Stream stream(T[] array) {
return stream(array, 0, array.length);
}
public Stream of(T... values) {
return Arrays.stream(values);
}
Podemos ver queStream.of() está realmente chamandoArrays.stream() internamente e essa é obviamente a razão pela qual obtemos os mesmos resultados.
Agora, vamos verificar os métodos no caso em que queremos converter uma matriz de primitivas:
public IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
public Stream of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Desta vez,Stream.of() não está chamandoArrays.stream().
4. Conclusão
Neste artigo, vimos como podemos converterStreams em arrays em Java e vice-versa. Também explicamos por que obtemos resultados diferentes ao converter um array deObjects e quando usamos um array de primitivas.
Como sempre, o código-fonte completo pode ser encontradoover on GitHub.