JAVA SE 8 的流库-1.10群组和分区

1.10 群组和分区

在上一节中,我们使每个映射表的值都生成单列集,然后指定将现有集与新集合并,这种处理显得有些冗长。
groupingBy支持将具有相同特性的值群聚成组。

Map<String, List<Locale>> countryToLocales = locales.collect(
				Collectors.groupingBy(Locale::getCountry));

函数Locale::getCountry是群组的分类函数,现在可以查找给定国家代码对应的所有地点了。

List<Locale> swissLocales = countryToLocales.get("CH");
  • 注意:每个Locale都有一个语言代码(如英语的en)和一个国家代码(如美国的US)。Locale en_US描述的是美国英语,en_IE是爱尔兰英语。某个国家有多个Locale。(一个国家可以有多个语言)

当分类函数是断言函数(即返回boolean值的函数)时,流的元素可以区分为两个列表:该函数返回true的元素和其他元素。在这种情况下,使用partitioningBy更加高效。

Map<Boolean,List<Locale>> englishAndOtherLocales = locales.collect(
				Collectors.partitioningBy(l->l.getLanguage().equals("en")));
		List<Locale> englishLocales = englishAndOtherLocales.get(true);
  • 注意:如果调用groupingByConcurrent方法,就会在使用并行流时获得一个被并行组装的并行映射表。这与toConcurrentMap方法完全类似。
  • 注意
    locales = Stream.of(Locale.getAvailableLocales()); 每次使用流时都要写一遍,因为当进行终止操作时,流就已经关闭了。不写则会报错stream has already been operated upon or closed
    (如有问题,请评论!Thanks♪(・ω・)ノ)

猜你喜欢

转载自blog.csdn.net/z036548/article/details/84190296