在Java中,Collectors.groupingBy()和Collectors.partitioningBy()都是用于对流元素进行分组的Collectors工具方法。它们之间的区别和联系如下:
功能:
Collectors.groupingBy():根据指定的分类函数将流元素分组为一个Map<K, List<T>>,其中K表示分组的键,List<T>表示该键对应的元素列表。
Collectors.partitioningBy():根据指定的条件对元素进行划分,将满足条件的元素放入true键对应的列表,不满足条件的元素放入false键对应的列表。
返回值类型:
Collectors.groupingBy():返回一个Map<K, List<T>>,其中K是根据分类函数生成的键,List<T>是该键对应的元素列表。
Collectors.partitioningBy():返回一个Map<Boolean, List<T>>,其中true键对应满足条件的元素列表,false键对应不满足条件的元素列表。
以下是一个示例代码演示Collectors.groupingBy()和Collectors.partitioningBy()的用法和区别:
java Copy code
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupingByPartitioningByExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
// 使用 groupingBy() 根据首字母分组
Map<Character, List<String>> groupByResult = fruits.stream()
.collect(Collectors.groupingBy(s -> s.charAt(0)));
System.out.println("Grouped by first letter:");
System.out.println(groupByResult);
// 使用 partitioningBy() 根据字符串长度划分
Map<Boolean, List<String>> partitioningByResult = fruits.stream()
.collect(Collectors.partitioningBy(s -> s.length() > 5));
System.out.println("\nPartitioned by length > 5:");
System.out.println(partitioningByResult);
}
}
在上述示例中,我们有一个水果列表fruits。首先,我们使用groupingBy()方法根据每个水果的首字母将它们分组成一个Map<Character, List<String>>,其中键是首字母,值是对应的水果列表。
接下来,我们使用partitioningBy()方法根据水果名称的长度是否大于5将它们进行划分,生成一个Map<Boolean, List<String>>,其中true键对应长度大于5的水果列表,false键对应长度不大于5的水果列表。
通过打印输出,我们可以查看分组和划分操作的结果。
需要注意的是,groupingBy()和partitioningBy()方法都提供了其他重载版本,使你能够对分组或划分的元素进行更复杂的操作,例如指定元素收集器、映射函数等。这些方法提供了更灵活的选项,以满足不同的需求。