Java 语言 集合的分组与分区 Collectors.groupingBy与partitioningBy

Java阿木 发布于 26 天前 5 次阅读


摘要:在Java编程中,集合操作是日常开发中不可或缺的一部分。其中,分组与分区是集合操作中的高级功能,可以帮助开发者更高效地处理数据。本文将围绕Java集合的分组与分区,重点解析Collectors.groupingBy与partitioningBy这两个方法,并通过实例代码展示其应用。

一、

在Java中,集合框架提供了丰富的API来处理各种数据结构。分组与分区是集合操作中的高级功能,可以帮助开发者将数据按照特定的规则进行分类和划分。本文将深入探讨Java集合的分组与分区,并详细介绍Collectors.groupingBy与partitioningBy这两个方法。

二、Collectors.groupingBy

Collectors.groupingBy是Java 8引入的一个非常有用的收集器,它可以将集合中的元素按照某个属性进行分组。下面是groupingBy的基本用法:

java

import java.util.List;


import java.util.Map;


import java.util.stream.Collectors;

public class GroupingByExample {


public static void main(String[] args) {


List<Person> people = List.of(


new Person("Alice", 25, "Female"),


new Person("Bob", 30, "Male"),


new Person("Charlie", 35, "Male"),


new Person("David", 28, "Male"),


new Person("Eve", 22, "Female")


);

Map<String, List<Person>> groupedByGender = people.stream()


.collect(Collectors.groupingBy(Person::getGender));

System.out.println(groupedByGender);


}


}

class Person {


private String name;


private int age;


private String gender;

public Person(String name, int age, String gender) {


this.name = name;


this.age = age;


this.gender = gender;


}

public String getGender() {


return gender;


}

@Override


public String toString() {


return "Person{" +


"name='" + name + ''' +


", age=" + age +


", gender='" + gender + ''' +


'}';


}


}


在上面的例子中,我们创建了一个Person类,并使用groupingBy方法根据性别对Person对象进行分组。输出结果将是一个Map,其中键是性别,值是具有该性别的Person对象的列表。

三、Collectors.partitioningBy

Collectors.partitioningBy是另一个非常有用的收集器,它可以将集合中的元素按照某个条件分为两部分:满足条件的元素和不满足条件的元素。下面是partitioningBy的基本用法:

java

import java.util.List;


import java.util.Map;


import java.util.stream.Collectors;

public class PartitioningByExample {


public static void main(String[] args) {


List<Person> people = List.of(


new Person("Alice", 25, "Female"),


new Person("Bob", 30, "Male"),


new Person("Charlie", 35, "Male"),


new Person("David", 28, "Male"),


new Person("Eve", 22, "Female")


);

Map<Boolean, List<Person>> partitionedByAge = people.stream()


.collect(Collectors.partitioningBy(person -> person.getAge() > 30));

System.out.println(partitionedByAge);


}


}


在上面的例子中,我们根据年龄是否大于30将Person对象分为两部分。输出结果将是一个Map,其中键是布尔值,表示年龄是否大于30,值是具有该年龄属性的Person对象的列表。

四、比较与总结

Collectors.groupingBy和Collectors.partitioningBy都是Java 8引入的收集器,它们在处理集合数据时非常有用。以下是两者的比较:

1. groupingBy:将元素按照某个属性进行分组,返回一个Map,键是分组依据,值是分组后的元素列表。

2. partitioningBy:将元素按照某个条件分为两部分,返回一个Map,键是布尔值,表示元素是否满足条件,值是满足或不满足条件的元素列表。

两者都可以通过lambda表达式或方法引用来指定分组或分区的依据。在实际应用中,根据具体需求选择合适的收集器。

五、结论

本文深入解析了Java集合的分组与分区,重点介绍了Collectors.groupingBy和Collectors.partitioningBy这两个方法。通过实例代码展示了它们的应用,帮助开发者更好地理解和运用这两个收集器。在实际开发中,合理运用分组与分区功能可以简化代码,提高程序的可读性和可维护性。