Rumah > Java > javaTutorial > teks badan

Cara menggunakan ciri baharu Java9 Stream Collectors

WBOY
Lepaskan: 2023-04-19 15:57:29
ke hadapan
932 orang telah melayarinya

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());
}
Salin selepas log masuk

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;
}
}
Salin selepas log masuk

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());
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan