我想比较 getCode 和 getMode 并找出重复的记录。
然后还有一个产品属性 getVode,它在两条记录中始终具有不同的值(真或假)。
P1 getCode getMode getVode
1 001 123 true
P2 getCode getMode getVode
2 001 123 false
我在下面试过,但它只找到重复项:
List<ProductModel> uniqueProducts = productsList.stream()
.collect(Collectors.collectingAndThen(
toCollection(() -> new TreeSet<>(
Comparator.comparing(ProductModel::getCode)
.thenComparing(ProductModel::getMode)
)),
ArrayList::new));
因此,当我发现重复记录时,我想检查 getVode 值(它是假的)并将其从列表中删除。 任何帮助将不胜感激?
最佳答案
据我所知,只有当元素是重复的并且它们的 getVode
方法返回 false
时,您才想删除元素。
我们可以从字面上做到这一点。首先,我们必须确定哪些元素是重复的:
Map<Object, Boolean> isDuplicate = productsList.stream()
.collect(Collectors.toMap(pm -> Arrays.asList(pm.getCode(), pm.getMode()),
pm -> false, (a, b) -> true));
然后,移除那些满足条件的:
productsList.removeIf(pm -> !pm.getVode()
&& isDuplicate.get(Arrays.asList(pm.getCode(), pm.getMode())));
或者,不修改旧列表:
List<ProductModel> uniqueProducts = new ArrayList<>(productsList);
uniqueProducts.removeIf(pm -> !pm.getVode()
&& isDuplicate.get(Arrays.asList(pm.getCode(), pm.getMode())));
也可以通过 Stream 操作来完成:
List<ProductModel> uniqueProducts = productsList.stream()
.filter(pm -> pm.getVode()
|| !isDuplicate.get(Arrays.asList(pm.getCode(), pm.getMode())))
.collect(Collectors.toList());
关于java - 从 Java 8 中基于多个属性的对象列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56805160/