首页 > 解决方案 > Java 8 使用流来区分具有重复字段值的对象

问题描述

我有一个对象列表。每个对象都有三个字段idsecNumbertypeType是可以具有值'new'或 '的枚举legacy'。有时会发生该列表中的对象具有相同secNumber的 a 但类型不同。

在这种情况下,我需要删除类型为“legacy”的那个。如何使用 Java 8 流来做到这一点?

标签: javafilterjava-8java-stream

解决方案


假设objects是一个List<ClassName>已经声明和初始化的:

List<ClassName> filteredObjects = objects.stream()
    .collect(Collectors.groupingBy(ClassName::getSecNumber))
    .values().stream()
    .flatMap(os -> os.stream().anyMatch(o -> o.getType() == Type.NEW) ?
        os.stream().filter(o -> o.getType() != Type.LEGACY) :
        os.stream()
    ).collect(Collectors.toList());

我假设只有在存在另一个具有相同Type.LEGACY类型的对象时才应该过滤掉类型的对象。我还假设您可以拥有多个相同的对象,并且可能需要保留这些对象。Type.NEWsecNumbertypesecNumber

请注意,collect(Collectors.groupingBy(ClassName::getSecNumber))从任何类型返回一个映射secNumberList<ClassName>因此调用values()它返回一个Collection<List<ClassName>>表示具有相同对象分组的集合secNumber

flatMap部分接受每个分组依据secNumber,检查分组是否至少有一个对象Type.NEW,如果有,则过滤掉类型的对象Type.LEGACY,否则它只是将要展平的对象传递到最终的对象中List<ClassName>。这主要是为了如果一个分组只有类型的对象,Type.LEGACY那么它们不会被排除在最终集合之外。


推荐阅读