业务作用域
1、用于map集合put值后又存放进list集合时 获取第一条数据就会不一致
假设:
1、定义一个map集合
Map<String,List> map = new HashMap();
2、往map集合put值
list+i为动态变量
if(monthlyReport.getFillingDateList().size()>0){
for (int i = 0;i < monthlyReport.getFillingDateList().size();i++){
//查询周报此日期所有数据集
map.put("list" + i,weeklyReportMapper.selectWeeklyReportByFillingDateList(monthlyReport.getFillingDateList().get(i)));
}
}
3、将map集合放进list集合中
weeklyReportList.addAll(value.stream().filter(item -> tProjectInfos.getId().equals(item.getProjectId())).collect(Collectors.toList()));
那么此时集合里的数据就是put的顺序,如果有业务是根据下表获取第一条或者最后一条时,那么数据就会出错
解决方案:
//1、获取迭代器
ListIterator<WeeklyReport> weeklyReportListIterator = weeklyReportList.listIterator();
//判断当前指向的位置后有没有元素
while (weeklyReportListIterator.hasNext()) {
//如果有获取当前指向位置的元素
weeklyReportListIterator.next();
}
//逆向循环list集合
//这时游标已定位到集合结尾处,判断游标位置前面是否有元素
while
(weeklyReportListIterator.hasPrevious()){
WeeklyReport previous = weeklyReportListIterator.previous();
//如果有元素,就获取到前面的元素并放置在创建的集合中
weeklyReportListN.add(previous);
}
ListIterator迭代器包含的方法有:
add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false hasPrevious() :
如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
next():返回列表中ListIterator指向位置后面的元素 nextIndex()
:返回列表中ListIterator所需位置后面元素的索引 previous() : 返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引 set(E
e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e
相同点:
都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。
不同点:
1).使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
2).ListIterator有add方法,可以向List中添加对象,而Iterator不能。
3).istIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
4).ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
5).都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。