|
我从 POJO 根据某些字段些字段名称对象分组的代码。以下是代码:
; D$ a+ I7 ]3 d, } ]: u- n
5 @/ ?: E$ ~4 F7 Z; H2 f- 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}]}( d, l$ u a/ C) V9 K
但是如果我想按多个字段分组怎么办?POJO 中groupingBy()实现equals()方法结束后,我显然可以在方法中传递一些 POJO,但是还有其他选项吗?例如,我可以按给定 POJO 中多个字段分组?
+ x3 B5 i0 f2 `! y. f9 _2 h! o: M例如,就我而言,我想根据我的名字和年龄进行分组。0 {4 k9 r% Z! z5 C' s3 X$ M
4 O! _' d: `, R& s7 \( w/ I3 \( z! `
解决方案: 2 Z. I' M9 v% I9 W/ O
你有几个选择。最简单的方法是链接你的收藏家:
& l$ d7 g H6 Y' O( ]Map> map = people .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge));# P1 c+ G* Q% g# s, Q, N; z
然后取名为 Fred 的 18 岁人的列表,您可以使用:
' D4 C# ^; t# ~ A; X4 K# Pmap.get("Fred").get(18);
1 s# j% n& u" C0 t1 Y. O. w2 T 第二种选择是定义表示分组的类别。这可以在 Person 内部。这个代码,record但在添加 JEP 在359 之前,它很容易成为Java 版本中的类(有equals和hashCode定义):
' t; I" B6 {4 ^3 I
( y% Z9 R) Q2 ` c- 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));
) h; I9 M+ V$ ]. ` 并搜索
3 O! U0 g$ F4 ]: t+ S2 Omap.get(new NameAge("Fred",18));
, S! x9 w" Q U* w6 o 最后,如果你不想实现你的组记录,你周围有很多 Java 有一个框架pair专门为这类事情设计的类别。apache commons pair如果您使用这些库中的一个,您可以将映射键设置为一对名称和年龄:
/ l, A1 `* _9 H1 Z3 r
7 ~/ S; c& s) \0 D/ |4 @. h! g" q- Map,List> map = people.collect(Collectors.groupingBy(p -> Pair.of(p.getName(),p.getAge()));code]并检索:[code]map.get(Pair.of("Fred",18));
, h# i+ P- b# g6 S2 {& Z4 Q2 a4 C 就我个人而言,我并没有真正看到通用元组的价值,因为它可以在语言中使用,因为它可以更好地显示意图,而且只需要很少的代码。 |
|