java - 从 Java 8 中基于多个属性的对象列表中删除重复项

标签 java java-8 java-stream

我想比较 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/

相关文章:

Android Studio 启用 Java8 支持

java - 使用 Java 8 计算两个日期之间的天数,同时忽略一周中的某些天数

java - IntelliJ IDEA 建议用 foreach 方法替换 for 循环。我应该尽可能这样做吗?

java - 如何使用 Stream API 删除符合特定条件的所有元素(除了其中 N 个最大的元素)

java - 我可以将 Spannable 转换为 Android 中的字符串以加载 ExpandableListView 吗?

java - 设备上的 Android 存储路径不一样?

java - 如何在 jbutton 单击时将 jlabel 添加到另一个下面

java - 如何从java中的响应中获取一部分?

java - 为什么没有 IntStream.flatMapToObj()?

java - 为什么我应该在带有收集的并行流中使用并发特性?