Java 8 Java 8流在列表中查找与某些属性匹配的对象

Java 8 Java 8流在列表中查找与某些属性匹配的对象,java-8,stream,java-stream,Java 8,Stream,Java Stream,假设我有下一张清单 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", "seco

假设我有下一张清单

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");
List List=new ArrayList();
添加(新的MyData(“id1”、“name1”、“secondName1”、“phone1”、“address1”);
添加(新的MyData(“id2”、“name2”、“secondName1”、“phone2”、“address2”);
添加(新的MyData(“id3”、“name3”、“secondName3”、“phone1”、“address1”);
添加(新的MyData(“id4”、“name4”、“secondName4”、“phone4”、“address4”);
使用Java8流,我想在我的列表中找到哪些项目具有相同的电话和地址

我在这个论坛上看到了许多只按一个属性过滤列表的解决方案,但我需要匹配两个或多个属性

您可以:

 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();
                    }));

为什么您认为按不同数量的属性进行过滤会使您的问题有所不同?我找到的一些解决方案是按一个属性进行分组,或者使用辅助
Set
,将要匹配的属性作为键,将对象作为值。我不能在有多个属性时立即使用这些解决方案。如果您愿意分组时,您将需要一个复合属性,其余的都是相同的。列表是穷人的复合类。它实现了equals()和hashCode()正确。但定义一个真正的ContactInformation类(包含电话和地址)以及按ContactInformation分组要干净得多。我已经回答了这个问题。使用列表按顺序存储属性值。这样做很有效,我看到您正在使用JB Nizet之前建议的列表。谢谢!@Federicoperalthaffner,因为这些将是那些没有duplicates@FedericoPeraltaSchaffner你让我在这里想了一会儿……费德里科不明白这一点吗?:)行!谢谢你