【问题标题】:Java 8 Stream find objects in list that match some propertiesJava 8 Stream 在列表中查找与某些属性匹配的对象
【发布时间】:2023-04-08 16:29:01
【问题描述】:

假设我有下一个列表

List<MyData> list = new ArrayList<>();
list.add(new MyData("id1", "name1", "secondName1", "phone1", "address1");
list.add(new MyData("id2", "name2", "secondName1", "phone2", "address2");
list.add(new MyData("id3", "name3", "secondName3", "phone1", "address1");
list.add(new MyData("id4", "name4", "secondName4", "phone4", "address4");

使用 Java8 流,我想在我的列表中查找哪些项目具有相同的电话和相同的地址。

我在这个论坛上看到了很多解决方案,可以减少仅按一个属性过滤列表,但我需要匹配两个或更多属性

【问题讨论】:

  • 为什么您认为按不同数量的属性进行过滤会使您的问题有所不同?
  • 我发现的一些解决方案是按一个属性收集分组,或者使用辅助Set,将要匹配的属性作为键,将对象作为值。一旦我拥有多个财产,我就无法使用这些解决方案。
  • 如果要分组,则需要一个复合属性,其余的都一样。
  • 列表是穷人的复合类。它正确地实现了 equals() 和 hashCode()。但是定义一个真正的 ContactInformation 类(包含电话和地址)并按 ContactInformation 分组要简洁得多。
  • 我已经回答了这个问题。使用 List 按顺序存储属性值。

标签: java-8 stream java-stream


【解决方案1】:

你可以这样做:

 list.stream()
            .collect(Collectors.collectingAndThen(
                    Collectors.groupingBy(
                            x -> Arrays.asList(x.getPhone(), x.getAddress()),
                            HashMap::new,
                            Collectors.toList()),
                    map -> {
                        map.values().removeIf(x -> x.size() == 1);
                        return map.values();
                    }));

【讨论】:

  • 这行得通,我看到您正在使用 JB Nizet 之前建议的列表。谢谢!
  • @FedericoPeraltaSchaffner 因为那些条目没有重复
  • @FedericoPeraltaSchaffner 你让我在这里想了一会儿...... Federico 不明白这个? :) 会做!谢谢你
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2011-10-16
  • 2018-06-27
相关资源
最近更新 更多