1.10 群组和分区
在上一节中,你看到了如何收集给定国家的所有语言,但是其处理显得有些冗长。你必须为每个映射表的值都生成单例集,然后指定如何将现有集与新集合并。将具有相同特性的值群聚成组是非常常见的,并且groupingBy方法直接就支持它。
让我们来看看通过国家来群组Locale的问题。首先,构建该映射表:
注意:快速复习一下地点:每个Locale都有一个语言代码(例如英语的en)和一个国家代码(例如美国的US)。Locale en_US描述的是美国英语,而en_IE是爱尔兰英语。某些国家有多个Locale。例如,ga_IE是爱尔兰的盖尔语,而前面的示例也展示了我的JVM知道瑞士有三个Locale。
当分类函数是断言函数(即返回boolean值的函数)时,流的元素可以分区为两个列表:该函数返回true的元素和其他的元素。在这种情况下,使用partitioningBy比使用groupingBy要更高效。例如,在下面的代码中,我们将所有Locale分成了使用英语和使用所有其他语言的两类:
注意:如果调用groupingByConcurrent方法,就会在使用并行流时获得一个被并行组装的并行映射表。这与toConcurrentMap方法完全类似。
java.util.stream.Collector 8
产生一个收集器,它会产生一个映射表,其键是true/false,而值是由满足/不满足断言的元素构成的列表。