这段代码中,oDo
是一个 List
类型的对象,subbedList
是从 oDo
中通过 subList(0, 3)
方法获取的子列表。subList
方法返回的是原列表 oDo
的一个视图,而不是一个独立的列表。这意味着对 subbedList
的任何修改都会反映到 oDo
上,反之亦然。
以下是代码的执行流程:
-
Collections.sort(oDo, (o1, o2) -> o2.getCreateTime().compareTo(o1.getCreateTime()));
这行代码对oDo
列表进行排序,排序的依据是每个对象的getCreateTime()
方法返回的值。 -
如果有相关单位超过三个,会抛出异常。
-
List<FileProcessResultDO> subbedList = oDo.subList(0, 3);
这行代码获取oDo
列表的前三个元素,并将其存储在subbedList
中。 -
oDo.clear();
这行代码清空了oDo
列表。 -
subbedList.forEach(r->oDo.add(r));
这行代码将subbedList
中的元素重新添加到oDo
列表中。
问题在于,subbedList
是 oDo
的一个视图,所以当 oDo.clear()
被调用时,oDo
被清空,同时 subbedList
也失去了它原本包含的元素,因为它只是 oDo
的一个子视图。这就是为什么 oDo
使用 clear
方法会影响 subbedList
的原因。
为了避免这个问题,你可以在清空 oDo
之前,先创建一个新的列表来存储 subbedList
的元素,如下所示:
List<FileProcessResultDO> subbedList = new ArrayList<>(oDo.subList(0, 3));
oDo.clear();
subbedList.forEach(r -> oDo.add(r));
这样,即使 oDo
被清空,subbedList
中的元素也不会受到影响,因为它已经复制到了一个新的列表中。