|
我从 POJO 根据某些字段些字段名称对象分组的代码。以下是代码:" A" V* i1 ^! u& F
# p) X& |6 Z/ b7 z# ^" D- 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("
erson{name='%s',age=%d,salary=%d}",name,age,salary); public static void main(String[] args) { Stream people = Stream.of(new Person(" aul",24、20000), new Person("Mark",30,30000), new Person("Will",28、28000), new Person("William",28、28000); Map[I]> peopleByAge; peopleByAge = people .collect(Collectors.groupingBy(p -> p.age,Collectors.mapping((Person p) -> p,toList()))System.out.println(peopleByAge); code]输出是(这是正确的):[code]{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}]}
7 j% A' E6 Z/ l* p4 `- ?# w2 Y 但是如果我想按多个字段分组怎么办?POJO 中groupingBy()实现equals()方法结束后,我显然可以在方法中传递一些 POJO,但是还有其他选项吗?例如,我可以按给定 POJO 中多个字段分组?
9 T B: j; Q0 m9 g( B例如,就我而言,我想根据我的名字和年龄进行分组。
: \9 J8 V. t$ D8 P7 }: C- e , R! V+ M% J) T0 G2 `
解决方案: 7 \/ Z4 A4 p& d% F* s7 B
你有几个选择。最简单的方法是链接你的收藏家:- j, g" i3 U1 [7 e
Map> map = people .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge));
- n+ K5 Z. J O+ s 然后取名为 Fred 的 18 岁人的列表,您可以使用:$ ]0 J! y0 a u# T' d8 Y
map.get("Fred").get(18);
6 b. f$ n" g: ]4 z. W1 u. F( K 第二种选择是定义表示分组的类别。这可以在 Person 内部。这个代码,record但在添加 JEP 在359 之前,它很容易成为Java 版本中的类(有equals和hashCode定义):
8 |8 k8 R* y* n0 ? C" } W/ ^
) m2 ?2 v, Y# p. j& }+ k- class Person record NameAge(String name,int age) public NameAge getNameAge() return new NameAge(name,age); code]然后可以用:[code]Map> map = people.collect(Collectors.groupingBy(Person::getNameAge));
2 L5 t( h7 \6 F 并搜索
8 L; \0 M5 a! I; O1 I; cmap.get(new NameAge("Fred",18));) ? t2 r' J i/ F5 \( b, X
最后,如果你不想实现你的组记录,你周围有很多 Java 有一个框架pair专门为这类事情设计的类别。apache commons pair如果您使用这些库中的一个,您可以将映射键设置为一对名称和年龄:
# c: Q& r% {' I
: @+ {3 p c( \& k' n& r, Q- Map,List> map = people.collect(Collectors.groupingBy(p -> Pair.of(p.getName(),p.getAge()));code]并检索:[code]map.get(Pair.of("Fred",18));/ a" N" e( H j4 @+ u: p4 J& G: |
就我个人而言,我并没有真正看到通用元组的价值,因为它可以在语言中使用,因为它可以更好地显示意图,而且只需要很少的代码。 |
|