gpt4 book ai didi

arraylist - 使用 Java 8 比较和删除 ArrayLists 中的对象

转载 作者:行者123 更新时间:2023-12-01 12:20:37 25 4
gpt4 key购买 nike

如果这是我应该知道的简单基本信息,我深表歉意。这是我第一次尝试使用 Java 8 流和其他功能。

我有两个包含相同类型对象的 ArrayList。比方说 list1list2 .假设列表中的 Person 对象具有属性“employeeId”。

场景是我需要合并这些列表。然而,list2可能有一些与 list1 中相同的对象.所以我试图从 list2 中删除对象与 list1 中的相同并获得一个结果列表,然后我可以将其合并到 list1 中.

我正在尝试使用 Java 8 removeIf()stream() 功能来实现这一点。以下是我的代码:

public List<PersonDto> removeDuplicates(List<PersonDto> list1, List<PersonDto> list2) {
List<PersonDto> filteredList = list2.removeIf(list2Obj -> {
list1.stream()
.anyMatch( list1Obj -> (list1Obj.getEmployeeId() == list2Obj.getEmployeeId()) );
} );
}

上面的代码编译错误如下:

类型 Collection 中的方法 removeIf(Predicate) 不适用于参数 (( list2Obj) -> {})

所以我改变了list2Obj在“removeIf()”到(<PersonDto> list2Obj) 的开头如下:

public List<PersonDto> removeDuplicates(List<PersonDto> list1, List<PersonDto> list2) {
List<PersonDto> filteredList = list2.removeIf((<PersonDto> list2Obj) -> {
list1.stream()
.anyMatch( list1Obj -> (list1Obj.getEmployeeId() == list2Obj.getEmployeeId()) );
} );
}

这给了我如下错误:

token “<”的语法错误,为 (<PersonDto> list2Obj) 中的“<”删除此 token 以及来自“-> {

的部分的 标记语法错误、错误放置的结构

我不知道我真正需要做什么才能让它发挥作用。

如果有人能帮我解决这个问题,我将不胜感激。

最佳答案

我稍微简化了您的函数以使其更具可读性:

public static List<PersonDto> removeDuplicates(List<PersonDto> left, List<PersonDto> right) {
left.removeIf(p -> {
return right.stream().anyMatch(x -> (p.getEmployeeId() == x.getEmployeeId()));
});
return left;
}

另请注意,您正在修改 left 参数,而不是创建新的 List

你也可以使用:left.removeAll(right),但是你需要 equalshashcode 并且你似乎不需要没有它们;或者它们基于 employeeId 之外的东西。

另一种选择是将这些列表收集到 TreeSet 并使用 removeAll:

TreeSet<PersonDto> leftTree = left.stream()
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PersonDto::getEmployeeId))));

TreeSet<PersonDto> rightTree = right.stream()
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PersonDto::getEmployeeId))));

leftTree.removeAll(rightTree);

关于arraylist - 使用 Java 8 比较和删除 ArrayLists 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44462340/

25 4 0