Menukar Antara Aliran dan Array di Jawa

1. Pengenalan

Adalah biasa untuk menukar pelbagai struktur data dinamik menjadi tatasusunan.

Dalam tutorial ini, kita akan menunjukkan cara menukar Stream ke array dan sebaliknya di Java.

2. Menukar Aliran ke Array

2.1. Rujukan Kaedah

Cara terbaik untuk menukar Stream ke dalam array adalah dengan menggunakan Stream ' s toArray () kaedah:

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

Sekarang, kita dapat dengan mudah menguji apakah penukaran berjaya:

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

2.2. Ungkapan Lambda

Setara lain adalah dengan menyampaikan ungkapan lambda ke kaedah toArray ():

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

Ini akan memberikan hasil yang sama dengan menggunakan kaedah rujukan.

2.3. Kelas Tersuai

Atau, kita boleh bersungguh-sungguh dan membuat kelas penuh.

Seperti yang dapat kita lihat dari dokumentasi Stream , IntFungsi memerlukan argumen. Ia mengambil ukuran array sebagai input dan mengembalikan array dengan ukuran itu.

Sudah tentu, IntFunction adalah antara muka sehingga kita dapat menerapkannya:

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

Kita kemudian dapat membina dan menggunakan seperti biasa:

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

Oleh itu, kita dapat membuat penegasan yang sama seperti sebelumnya.

2.4. Susunan Primitif

Pada bahagian sebelumnya, kami meneroka cara menukar String Stream ke array String . Sebenarnya, kita boleh melakukan penukaran dengan cara ini untuk Objek apa pun dan kelihatan sangat serupa dengan contoh String di atas.

Ia sedikit berbeza untuk primitif. Jika kita mempunyai Stream of Integer s yang kita mahu menukar kepada int [] , sebagai contoh, kita perlu pertama untuk memanggil mapToInt () kaedah:

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

Terdapat juga kaedah mapToLong () dan mapToDouble () yang kami gunakan. Juga, harap maklum bahawa kami tidak menyampaikan argumen ke toArray () kali ini.

Akhirnya, mari kita tegaskan persamaan dan sahkan bahawa kita mempunyai susunan int kita dengan betul:

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

Bagaimana jika kita perlu melakukan sebaliknya? Mari kita lihat.

3. Menukar Array ke Aliran

Kita tentu juga boleh pergi ke arah yang lain. Dan Java mempunyai beberapa kaedah khusus untuk itu.

3.1. Array Objek s

Kita boleh menukar lokasi kepada Stream menggunakan Arrays.stream () atau Stream.of () kaedah :

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

Kita harus perhatikan bahawa dalam kedua-dua kes ini, Aliran kami adalah sama dengan tatasusunan kami.

3.2. Array of Primitives

Begitu juga, kita boleh menukar pelbagai primitif:

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

Tetapi, berbeza dengan menukar susunan Objek , ada perbezaan penting. Semasa menukar array primitif, Arrays.stream () mengembalikan IntStream , sementara Stream.of () mengembalikan Stream .

3.3. Arrays.stream vs. Stream.of

Untuk memahami perbezaan yang disebutkan di bahagian sebelumnya, kami akan melihat pelaksanaan kaedah yang sesuai.

Mari pertama-tama kita melihat pelaksanaan dua kaedah berikut di Jawa:

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

Kita dapat melihat bahawa Stream.of () sebenarnya memanggil Arrays.stream () secara dalaman dan itulah sebabnya mengapa kita mendapat hasil yang sama.

Sekarang, kita akan periksa kaedahnya sekiranya kita mahu menukar pelbagai 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

Dalam artikel ini, kita melihat bagaimana kita dapat mengubah Stream s menjadi array di Java dan sebaliknya. Kami juga menjelaskan mengapa kami mendapat hasil yang berbeza ketika menukar array Objek dan ketika kami menggunakan array primitif.

Seperti biasa, kod sumber lengkap boleh didapati di GitHub.