首页 > 解决方案 > 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 我的错。比我需要另一个列表或数组来存储响应数据。

假设我有

  1. 1234 : 25/5/1991
  2. 1235 : 25/5/1995
  3. 1234 : 25/5/1999

所以我需要结果

  1. 1235 : 25/5/1995
  2. 1234 : 25/5/1999

谢谢你们。

标签: javaloopsjava-8nestedjava-stream

解决方案


按 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());

推荐阅读