回答

收藏

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

技术问答 技术问答 283 人阅读 | 0 人回复 | 2023-09-12

我从 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(&quoterson{name='%s',age=%d,salary=%d}",name,age,salary);         public static void main(String[] args) {        Stream people = Stream.of(new Person(&quotaul",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# P
    map.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 O
    map.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
就我个人而言,我并没有真正看到通用元组的价值,因为它可以在语言中使用,因为它可以更好地显示意图,而且只需要很少的代码。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则