Operasi Rentetan dengan Aliran Java

1. Gambaran keseluruhan

Java 8 telah memperkenalkan API Aliran baru yang memungkinkan kita memproses data secara deklaratif.

Dalam artikel ini cepat, kita akan belajar bagaimana untuk menggunakan Stream API untuk berpecah yang dipisahkan koma String ke dalam senarai Strings dan bagaimana untuk menyertai String mudah menjadi dipisahkan koma String .

Kami juga akan melihat cara menukar array rentetan ke peta menggunakan Stream API.

Hampir sepanjang masa kita menghadapi situasi, di mana kita perlu mengulang beberapa Koleksi Java dan menyaring Koleksi berdasarkan beberapa logik penyaringan. Dalam pendekatan tradisional untuk situasi seperti ini, kita akan menggunakan banyak gelung dan operasi if-else untuk mendapatkan hasil yang diinginkan.

Sekiranya anda ingin membaca lebih lanjut mengenai Stream API, baca artikel ini.

2. Bergabung dengan String API Stream

Mari gunakan Stream API untuk membuat fungsi yang akan menggabungkan array String ke String yang dipisahkan koma :

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

Perkara yang perlu diberi perhatian di sini:

  • Fungsi stream () mengubah sebarang Koleksi menjadi aliran data
  • fungsi map () digunakan untuk memproses data
  • Ada juga fungsi lain, bernama filter () , di mana kita dapat memasukkan kriteria penyaringan

Mungkin ada senario, di mana kita mungkin mahu bergabung dengan String dengan beberapa awalan 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 dapat kita lihat dalam kaedah Collectors.joining () , kita menyatakan awalan kita sebagai '[' dan postfix sebagai ']' ; oleh itu String yang dihasilkan akan dibuat dengan format [… ..] yang dinyatakan .

3. Memisahkan Rentetan Dengan Stream API

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

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

Anda juga boleh menukar String ke senarai Karakter secara langsung menggunakan Stream API:

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

Satu fakta menarik untuk diperhatikan di sini adalah bahawa kaedah chars () mengubah String menjadi aliran Integer di mana setiap nilai Integer menunjukkan nilai ASCII setiap urutan Char . Itulah sebabnya kita perlu menaip objek mapper secara eksplisit dalam kaedah mapToObj () .

4. String Array ke Peta Dengan Stream API

Kita juga dapat menukar array String ke peta menggunakan split dan Collectors.toMap , dengan syarat setiap item dalam array mengandungi entiti 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 bahawa untuk mengelakkan kesalahan kompilasi, kita harus memastikan bahawa kod disusun menggunakan Java 1.8 . Untuk melakukan ini, kita perlu menambahkan pemalam berikut di pom.xml :

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

5. Menguji

Oleh kerana kita sudah selesai membuat fungsi, mari buat kes ujian untuk mengesahkan hasilnya.

Pertama, mari uji kaedah penyertaan mudah 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); }

Seterusnya, mari buat yang lain untuk menguji fungsi pemisahan mudah kami:

@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); }

Akhirnya, mari kita uji rentetan String kami untuk memetakan fungsi:

@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 kes ujian yang selebihnya.

6. Kesimpulannya

Stream API menyediakan kami teknik pemprosesan data yang canggih. Cara baru menulis kod ini sangat cekap dari segi pengurusan memori timbunan dalam persekitaran berbilang benang.

Seperti biasa, kod sumber penuh boleh didapati di Github.