Mengonversi Antara Stream dan Array di Java

1. Perkenalan

Merupakan hal yang umum untuk perlu mengubah berbagai struktur data dinamis menjadi array.

Dalam tutorial ini, kami akan mendemonstrasikan cara mengonversi Stream menjadi array dan sebaliknya di Java.

2. Mengubah Stream menjadi Array

2.1. Referensi Metode

Cara terbaik untuk mengkonversi Streaming ke dalam sebuah array adalah dengan menggunakan Streaming' s toArray () metode:

public String[] usingMethodReference(Stream stringStream) { return stringStream.toArray(String[]::new); }

Sekarang, kami dapat dengan mudah menguji apakah konversi berhasil:

Stream stringStream = Stream.of("baeldung", "convert", "to", "string", "array"); assertArrayEquals(new String[] { "baeldung", "convert", "to", "string", "array" }, usingMethodReference(stringStream));

2.2. Ekspresi Lambda

Persamaan lainnya adalah meneruskan ekspresi lambda ke metode toArray ():

public static String[] usingLambda(Stream stringStream) { return stringStream.toArray(size -> new String[size]); }

Ini akan memberi kita hasil yang sama dengan menggunakan referensi metode.

2.3. Kelas Kustom

Atau, kita bisa bekerja keras dan menciptakan kelas yang hebat.

Seperti yang bisa kita lihat dari dokumentasi Stream , ini menggunakan IntFungsi sebagai argumen. Dibutuhkan ukuran array sebagai input dan mengembalikan array dengan ukuran itu.

Tentu saja, IntFunction adalah sebuah antarmuka sehingga kami dapat mengimplementasikannya:

class MyArrayFunction implements IntFunction { @Override public String[] apply(int size) { return new String[size]; } };

Kami kemudian dapat membangun dan menggunakan seperti biasa:

public String[] usingCustomClass(Stream stringStream) { return stringStream.toArray(new MyArrayFunction()); }

Akibatnya, kita bisa membuat pernyataan yang sama seperti sebelumnya.

2.4. Array Primitif

Di bagian sebelumnya, kita telah mempelajari cara mengonversi Stream String menjadi array String . Faktanya, kita dapat melakukan konversi dengan cara ini untuk Objek apa pun dan akan terlihat sangat mirip dengan contoh String di atas.

Ini sedikit berbeda untuk primitif. Jika kita memiliki Stream of Integer yang ingin kita ubah menjadi int [] , misalnya, pertama-tama kita perlu memanggil metode mapToInt () :

public int[] intStreamToPrimitiveIntArray(Stream integerStream) { return integerStream.mapToInt(i -> i).toArray(); }

Ada juga metode mapToLong () dan mapToDouble () yang kami inginkan. Juga, harap perhatikan bahwa kami tidak memberikan argumen apa pun ke toArray () kali ini.

Terakhir, mari lakukan pernyataan persamaan dan konfirmasi bahwa kita telah mendapatkan larik int dengan benar:

Stream integerStream = IntStream.rangeClosed(1, 7).boxed(); assertArrayEquals(new int[]{1, 2, 3, 4, 5, 6, 7}, intStreamToPrimitiveIntArray(integerStream));

Namun, bagaimana jika kita perlu melakukan yang sebaliknya? Mari lihat.

3. Mengubah Array menjadi Stream

Kita bisa, tentu saja, pergi ke arah lain juga. Dan Java memiliki beberapa metode khusus untuk itu.

3.1. Array Objek s

Kita dapat mengonversi array menjadi Stream menggunakan metode Arrays.stream () atau Stream.of () :

public Stream stringArrayToStreamUsingArraysStream(String[] stringArray) { return Arrays.stream(stringArray); } public Stream stringArrayToStreamUsingStreamOf(String[] stringArray) { return Stream.of(stringArray); }

Kami harus mencatat bahwa dalam kedua kasus, Stream kami memiliki waktu yang sama dengan array kami.

3.2. Array of Primitives

Demikian pula, kita dapat mengonversi larik primitif:

public IntStream primitiveIntArrayToStreamUsingArraysStream(int[] intArray) { return Arrays.stream(intArray); } public Stream primitiveIntArrayToStreamUsingStreamOf(int[] intArray) { return Stream.of(intArray); }

Tapi, berbeda dengan mengubah array Object , ada perbedaan penting. Saat mengonversi array primitif, Arrays.stream () mengembalikan IntStream , sementara Stream.of () mengembalikan Stream .

3.3. Arrays.stream vs. Stream.of

Untuk memahami perbedaan yang disebutkan di bagian sebelumnya, kita akan melihat penerapan metode yang sesuai.

Pertama-tama, mari kita lihat implementasi Java dari dua metode ini:

public  Stream stream(T[] array) { return stream(array, 0, array.length); } public  Stream of(T... values) { return Arrays.stream(values); }

Kita dapat melihat bahwa Stream.of () sebenarnya memanggil Arrays.stream () secara internal dan itu jelas alasan mengapa kita mendapatkan hasil yang sama.

Sekarang, kita akan memeriksa metode jika kita ingin mengonversi array primitif:

public IntStream stream(int[] array) { return stream(array, 0, array.length); } public  Stream of(T t) { return StreamSupport.stream(new Streams.StreamBuilderImpl(t), false); }

Kali ini, Stream.of () tidak memanggil Arrays.stream () .

4. Kesimpulan

Pada artikel ini, kami melihat bagaimana kami dapat mengonversi Stream menjadi array di Java dan sebaliknya. Kami juga menjelaskan mengapa kami mendapatkan hasil yang berbeda saat mengonversi larik Objek dan saat kami menggunakan larik primitif.

Seperti biasa, kode sumber lengkap dapat ditemukan di GitHub.