Ciri baharu Java 9 Stream Collectors
Java 8 memperkenalkan Collectors, yang digunakan untuk mengumpul elemen input ke dalam bekas boleh ubah seperti Peta, Senarai dan Set. Artikel ini melihat dua Pengumpul baharu dalam Java 9: Collectors.filtering dan Collectors.flatMapping, yang digunakan terutamanya untuk menyediakan koleksi elemen pintar bersama-sama dengan Collectors.groupingBy.
Collectors. kaedah penapisan
Kaedah Collectors.filtering adalah serupa dengan kaedah Stream filter(), yang digunakan untuk menapis elemen input, tetapi senario penggunaan kedua-duanya adalah berbeza. Penapis strim() digunakan dalam kaedah rantaian strim, manakala kaedah penapisan Collectors.filtering direka untuk digunakan dengan groupingBy.
Penapis strim() mula-mula menapis elemen dan kemudian mengumpulkannya. Nilai yang ditapis dibuang dan tidak boleh dikesan secara retroaktif. Jika anda perlu menjejaki perkara yang anda perlu kumpulkan dahulu dan kemudian tapis, itulah yang Collectors.filtering boleh lakukan.
Collectors.filtering mengambil parameter fungsi untuk menapis parameter input, dan kemudian mengumpulkan elemen penapis:
@Test public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() { List<Integer> numbers = List.of(1, 2, 3, 5, 5); Map<Integer, Long> result = numbers.stream() .filter(val -> val > 3) .collect(Collectors.groupingBy(i -> i, Collectors.counting())); assertEquals(1, result.size()); result = numbers.stream() .collect(Collectors.groupingBy(i -> i, Collectors.filtering(val -> val > 3, Collectors.counting()))); assertEquals(4, result.size()); }
Collectors.flatMapping kaedah
Collectors.flatMapping adalah serupa dengan kaedah Collectors.mapping, tetapi lebih berbutir. Kedua-duanya mengambil fungsi dan parameter pengumpul untuk mengumpul elemen, tetapi fungsi flatMapping menerima aliran elemen dan kemudian melakukan operasi pengumpulan melalui pengumpul. Mula-mula, mari lihat kelas model:
class Blog { private String authorName; private List<String> comments = new ArrayList<>(); public Blog(String authorName, String ... comment){ this.authorName = authorName; comments.addAll(Arrays.asList(comment)); } public String getAuthorName(){ return this.authorName; } public List<String> getComments(){ return comments; } }
Kaedah Collectors.flatMapping melangkau koleksi perantaraan dan menulis terus ke bekas pemetaan kumpulan tunggal yang ditakrifkan oleh Collectors.groupingBy:
@Test public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() { Blog blog1 = new Blog("1", "Nice", "Very Nice"); Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better"); List<Blog> blogs = List.of(blog1, blog2); Map<String, List<List<String>>> authorComments1 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.mapping(Blog::getComments, Collectors.toList()))); assertEquals(2, authorComments1.size()); assertEquals(2, authorComments1.get("1").get(0).size()); assertEquals(3, authorComments1.get("2").get(0).size()); Map<String, List<String>> authorComments2 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.flatMapping(blog -> blog.getComments().stream(), Collectors.toList()))); assertEquals(2, authorComments2.size()); assertEquals(2, authorComments2.get("1").size()); assertEquals(3, authorComments2.get("2").size()); }
Pengumpul. memetakan semua nilai yang dikumpulkan (ulasan pengarang) ke bekas koleksi, seperti Senarai. Dan padamkan koleksi perantaraan dan simpan koleksi terus ke dalam bekas pengumpul.
Atas ialah kandungan terperinci Cara menggunakan ciri baharu Java9 Stream Collectors. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!