gpt4 book ai didi

java - 在java 8中按多个字段名分组

转载 作者:IT老高 更新时间:2023-10-28 20:20:58 25 4
gpt4 key购买 nike

我从 POJO 中找到了按字段名称对对象进行分组的代码。下面是代码:

public class Temp {

static class Person {

private String name;
private int age;
private long salary;

Person(String name, int age, long salary) {

this.name = name;
this.age = age;
this.salary = salary;
}

@Override
public String toString() {
return String.format("Person{name='%s', age=%d, salary=%d}", name, age, salary);
}
}

public static void main(String[] args) {
Stream<Person> people = Stream.of(new Person("Paul", 24, 20000),
new Person("Mark", 30, 30000),
new Person("Will", 28, 28000),
new Person("William", 28, 28000));
Map<Integer, List<Person>> peopleByAge;
peopleByAge = people
.collect(Collectors.groupingBy(p -> p.age, Collectors.mapping((Person p) -> p, toList())));
System.out.println(peopleByAge);
}
}

输出是(正确的):

{24=[Person{name='Paul', age=24, salary=20000}], 28=[Person{name='Will', age=28, salary=28000}, Person{name='William', age=28, salary=28000}], 30=[Person{name='Mark', age=30, salary=30000}]}

但是如果我想按多个字段进行分组怎么办?在该 POJO 中实现 equals() 方法后,我显然可以在 groupingBy() 方法中传递一些 POJO,但是还有其他选项,例如我可以按多个字段分组给定的 POJO?

例如就我而言,我想按姓名和年龄分组。

最佳答案

这里有几个选项。最简单的方法是链接你的收集器:

Map<String, Map<Integer, List<Person>>> map = people
.collect(Collectors.groupingBy(Person::getName,
Collectors.groupingBy(Person::getAge));

然后要获得一个名为 Fred 的 18 岁的人的列表,您可以使用:

map.get("Fred").get(18);

第二个选项是定义一个代表分组的类。这可以在 Person 内部。此代码使用 record 但它可以很容易地成为 JEP 359 之前的 Java 版本中的类(定义了 equalshashCode)补充:

class Person {
record NameAge(String name, int age) { }

public NameAge getNameAge() {
return new NameAge(name, age);
}
}

那么你可以使用:

Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));

并使用搜索

map.get(new NameAge("Fred", 18));

最后,如果您不想实现自己的组记录,那么周围的许多 Java 框架都有一个为这种类型的东西设计的 pair 类。例如:apache commons pair如果您使用其中一个库,则可以将 map 的键设为姓名和年龄:

Map<Pair<String, Integer>, List<Person>> map =
people.collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));

并通过以下方式检索:

map.get(Pair.of("Fred", 18));

我个人并没有真正看到通用元组有多大值(value),因为记录可以在该语言中使用,因为记录可以更好地显示意图并且只需要很少的代码。

关于java - 在java 8中按多个字段名分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28342814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com