回答

收藏

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

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

我从 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(&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}]}
    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; c
    map.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: |
就我个人而言,我并没有真正看到通用元组的价值,因为它可以在语言中使用,因为它可以更好地显示意图,而且只需要很少的代码。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则