java - Java Streams 在同一个列表上循环两次
问题描述
我是 java 8 的新手,由于某种原因我在理解流时遇到了问题。假设我们有一个对象列表 List<MyObject>,其中 MyObject 有 2 个字段:Long Id、Date insertTime,并且我想删除具有相同 ID 和更早时间的元素。
使用 2 个 for 循环,它是这样的:
for(MyObject object : myObjects) {
for(MyObject tmpObject : myObjects) {
if(object.getId() == tmpObject.getId()) {
if(object.getInsertDate().after(tmpObject.getInsertDate()))
myObjects.remove(tmpObject);
else
myObjects.remove(object);
}
}
}
使用流时会是什么样子?
@Michael 我的错。比我需要另一个列表或数组来存储响应数据。
假设我有
- 1234 : 25/5/1991
- 1235 : 25/5/1995
- 1234 : 25/5/1999
所以我需要结果
- 1235 : 25/5/1995
- 1234 : 25/5/1999
谢谢你们。
解决方案
按 id 分组,然后为每个 id 选择插入日期最大的那个。您可以用 MyObject 替换 Sample。
Map<Long, List<Sample>> map = list.stream().collect(Collectors.groupingBy(Sample::getId));
map.values().stream()
.map(samples -> Collections.max(
samples, Comparator.comparing(Sample::getInsertDate)))
.collect(Collectors.toList());
推荐阅读
- hashicorp-vault - 允许用户更新/删除某些策略(Hashicorp Vault)
- python - 运行我的 CNN model.fit 时出现 PIL 未识别图像错误
- python - Fashion Mnist TensorFlow 数据形状不兼容
- asp.net-core - 是单例 HttpClient X 分钟后接收新的 HttpMessageHandler
- python - 有没有办法在 Python 中模拟后台控制台活动?
- wix - 在 .wixproj 文件中使用 Exec 命令时字符 %20 转义
- firebase - Firestore - 使用云函数更新嵌套对象不适用于合并设置为 true
- templates - 如何去掉页面头部
- android - 如何在android中更新RecyclerView的单个图像
- postgresql - Postgres:用于换行的正则表达式