Operasi String dengan Java Streams

1. Ikhtisar

Java 8 telah memperkenalkan API Stream baru yang memungkinkan kami memproses data secara deklaratif.

Dalam artikel ini cepat, kita akan belajar bagaimana menggunakan Streaming API untuk membagi dipisahkan koma String ke daftar Strings dan bagaimana untuk bergabung dengan String array yang menjadi dipisahkan koma String .

Kami juga akan melihat cara mengonversi larik string untuk dipetakan menggunakan API Stream .

Hampir sepanjang waktu kita menghadapi situasi, di mana kita perlu mengulang beberapa Koleksi Java dan memfilter Koleksi berdasarkan beberapa logika pemfilteran. Dalam pendekatan tradisional untuk jenis situasi ini, kami akan menggunakan banyak loop dan operasi if-else untuk mendapatkan hasil yang diinginkan.

Jika Anda ingin membaca lebih lanjut tentang API Aliran , lihat artikel ini.

2. Menggabungkan String dengan Stream API

Mari kita gunakan Streaming API untuk membuat fungsi yang akan bergabung dengan String array yang menjadi dipisahkan koma String :

public static String join(String[] arrayOfString){ return Arrays.asList(arrayOfString) .stream() //.map(...) .collect(Collectors.joining(",")); }

Poin yang perlu diperhatikan di sini:

  • Fungsi stream () mengubah Koleksi apa pun menjadi aliran data
  • fungsi map () digunakan untuk mengolah data
  • Ada juga fungsi lain, bernama filter () , di mana kita bisa memasukkan kriteria pemfilteran

Ada beberapa skenario, di mana kita mungkin ingin menggabungkan sebuah String dengan beberapa prefiks dan postfix tetap. Dengan Stream API kita dapat melakukannya dengan cara berikut:

public static String joinWithPrefixPostfix(String[] arrayOfString){ return Arrays.asList(arrayOfString) .stream() //.map(...) .collect(Collectors.joining(",","[","]")); }

Seperti yang bisa kita lihat dalam metode Collectors.joining () , kita mendeklarasikan awalan kita sebagai '[' dan postfix sebagai ']' ; maka String yang dihasilkan akan dibuat dengan format [… ..] yang dideklarasikan .

3. Memisahkan String Dengan Stream API

Sekarang, mari buat sebuah fungsi, yang akan memisahkan String yang dipisahkan koma menjadi daftar String menggunakan API Stream :

public static List split(String str){ return Stream.of(str.split(",")) .map (elem -> new String(elem)) .collect(Collectors.toList()); }

Ini juga memungkinkan untuk secara langsung mengonversi String ke daftar Karakter menggunakan API Stream :

public static List splitToListOfChar(String str) { return str.chars() .mapToObj(item -> (char) item) .collect(Collectors.toList()); }

Satu fakta menarik untuk dicatat di sini adalah bahwa metode chars () mengubah String menjadi aliran Integer di mana setiap nilai Integer menunjukkan nilai ASCII dari setiap urutan Char . Itulah mengapa kita perlu secara eksplisit mengetikkan objek mapper dalam metode mapToObj () .

4. String Array ke Map Dengan Stream API

Kita juga dapat mengonversi array String untuk dipetakan menggunakan split dan Collectors.toMap , asalkan setiap item dalam array berisi entitas nilai kunci yang digabungkan oleh pemisah:

public static Map arrayToMap(String[] arrayOfString) { return Arrays.asList(arrayOfString) .stream() .map(str -> str.split(":")) .collect(toMap(str -> str[0], str -> str[1])); }

Di sini, ":" adalah pemisah nilai kunci untuk semua elemen dalam array String.

Harap diingat bahwa untuk menghindari kesalahan kompilasi, kita perlu memastikan bahwa kode dikompilasi menggunakan Java 1.8 . Untuk melakukan ini, kita perlu menambahkan plugin berikut di pom.xml :

   org.apache.maven.plugins maven-compiler-plugin 3.3  1.8 1.8    

5. Pengujian

Karena kita sudah selesai membuat fungsi, mari buat kasus uji untuk memverifikasi hasilnya.

Pertama, mari kita uji metode penggabungan sederhana kami:

@Test public void givenArray_transformedToStream_convertToString() { String[] programmingLanguages = {"java", "python", "nodejs", "ruby"}; String expectation = "java,python,nodejs,ruby"; String result = JoinerSplitter.join(programmingLanguages); assertEquals(result, expectation); }

Selanjutnya, mari buat yang lain untuk menguji fungsionalitas pemisahan sederhana kita:

@Test public void givenString_transformedToStream_convertToList() { String programmingLanguages = "java,python,nodejs,ruby"; List expectation = new ArrayList(); expectation.add("java"); expectation.add("python"); expectation.add("nodejs"); expectation.add("ruby"); List result = JoinerSplitter.split(programmingLanguages); assertEquals(result, expectation); }

Terakhir, mari kita uji array String untuk memetakan fungsionalitas:

@Test public void givenStringArray_transformedToStream_convertToMap() { String[] programming_languages = new String[] {"language:java","os:linux","editor:emacs"}; Map expectation=new HashMap(); expectation.put("language", "java"); expectation.put("os", "linux"); expectation.put("editor", "emacs"); Map result = JoinerSplitter.arrayToMap(programming_languages); assertEquals(result, expectation); }

Dengan cara yang sama, kita perlu membuat kasus uji lainnya.

6. Kesimpulan

Stream API memberi kami teknik pemrosesan data yang canggih. Cara baru penulisan kode ini sangat efisien dalam hal manajemen memori heap dalam lingkungan multi-thread.

Seperti biasa, kode sumber lengkap tersedia di Github.