java - Java 8 使用流来区分具有重复字段值的对象
问题描述
我有一个对象列表。每个对象都有三个字段id
:secNumber
和type
。Type
是可以具有值'new'
或 '的枚举legacy'
。有时会发生该列表中的对象具有相同secNumber
的 a 但类型不同。
在这种情况下,我需要删除类型为“legacy”的那个。如何使用 Java 8 流来做到这一点?
解决方案
假设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.NEW
secNumber
type
secNumber
请注意,collect(Collectors.groupingBy(ClassName::getSecNumber))
从任何类型返回一个映射secNumber
,List<ClassName>
因此调用values()
它返回一个Collection<List<ClassName>>
表示具有相同对象分组的集合secNumber
。
该flatMap
部分接受每个分组依据secNumber
,检查分组是否至少有一个对象Type.NEW
,如果有,则过滤掉类型的对象Type.LEGACY
,否则它只是将要展平的对象传递到最终的对象中List<ClassName>
。这主要是为了如果一个分组只有类型的对象,Type.LEGACY
那么它们不会被排除在最终集合之外。
推荐阅读
- activemq-artemis - 如何将 Core 消息转换为 JMS 消息?
- jmeter - 在 JMeter dosnt 工作中连续运行线程组
- c++ - 在 Windows 10 上的 Visual Studio 2015 中缺少一些标准库头文件
- ruby - 哈希似乎是通过引用传递的:Ruby
- java - E/StorageException: 无法获取上传 URL
- javascript - 分别显示自定义字段和映射字段 - reactJS
- flutter - Flutter SingleChildScrollView 不滚动
- javascript - 如何动态查找对象内的键值?
- java - 具体的@SingletonScope 和@PrototypeScope 注解
- python - pandas bdate_range freq=monthly 不只返回工作日