java8 List根据多个字段去分类
时间: 2024-02-17 22:01:29 浏览: 22
在Java8中,您可以使用Stream API对List进行分组,然后使用Collectors.groupingBy()方法将其分组。在这个方法中,您可以使用一个Function来指定分组条件,例如按照某个字段进行分组。如果您想要按照多个字段进行分组,您可以将这些字段组合成一个键,然后将其作为Function的返回值。以下是一个示例代码:
```
List<MyObject> myList = new ArrayList<>();
// 假设 MyObject 有两个字段 name 和 age
Map<String, Map<Integer, List<MyObject>>> groupedMap = myList.stream()
.collect(Collectors.groupingBy(obj -> obj.getName() + obj.getAge(),
Collectors.groupingBy(MyObject::getAge)));
```
在这个示例中,我们将MyObject对象按照 name + age 的组合作为键来进行分组,然后使用Collectors.groupingBy()将其进一步分组。这将生成一个Map<String, Map<Integer, List<MyObject>>>对象,其中第一层Map的键是 name + age 的组合,第二层Map的键是 age,值是相应的MyObject对象列表。
注意,这只是一个示例代码,您可以根据自己的需求调整分组条件和返回值类型。
相关问题
java中list根据多个字段分组
要根据多个字段分组,可以使用Java 8的Stream API和Collectors.groupingBy()方法。以下是一个示例代码:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupByMultipleFieldsExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 25, "female"),
new Person("Bob", 30, "male"),
new Person("Charlie", 25, "male"),
new Person("Dave", 35, "male"),
new Person("Eve", 30, "female")
);
Map<String, Map<Integer, List<Person>>> groupedPeople = people.stream()
.collect(Collectors.groupingBy(Person::getGender, Collectors.groupingBy(Person::getAge)));
System.out.println(groupedPeople);
}
static class Person {
private final String name;
private final int age;
private final String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
}
```
在这个示例中,我们有一个Person类,它有三个属性:name、age和gender。我们有一个人员列表,我们想根据性别和年龄分组。我们使用Java 8的Stream API和Collectors.groupingBy()方法来实现这一点。我们首先按性别分组,然后按年龄分组。最终,我们得到一个Map对象,其中每个性别键对应另一个Map对象,该对象包含按年龄分组的人员列表。
java List 根据多个字段去重
如果想要根据多个字段去重,可以使用 Java 8 的 Stream API 和 lambda 表达式结合 `distinct()` 方法和 `Comparator.comparing()` 方法来实现。具体实现代码如下:
```java
List<ClientFollowUp> distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
```
上述代码中的 `distinct()` 方法会根据对象的 `equals()` 和 `hashCode()` 方法去重,而 `Comparator.comparing()` 方法可以指定多个字段作为比较的条件,例如:
```java
List<ClientFollowUp> distinctList = list.stream()
.distinct()
.sorted(Comparator.comparing(ClientFollowUp::getTitle)
.thenComparing(ClientFollowUp::getCountry)
.thenComparing(ClientFollowUp::getCustomerName))
.collect(Collectors.toList());
```
上述代码中使用了 `sorted()` 方法来指定多个字段作为比较的条件,其中 `thenComparing()` 方法表示在前一个条件相等的情况下使用后一个条件进行比较。这样就能实现根据多个字段去重的操作了。