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♪(・ω・)ノ)