Java Streams用于在同一列表上循环两次

drd*_*z13 2 java loops nested java-8 java-stream

我是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);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

使用流时看起来如何?

@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

谢谢你们.

gag*_*ngh 7

按ID分组然后为每个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());
Run Code Online (Sandbox Code Playgroud)

  • 不是将每个组收集到`List`中,而是在第二步中选择最大元素,您可以让`groupingBy`操作首先收集最大元素,如[this answer](https://stackoverflow .com/a/51132072/2711488)。 (2认同)