在开发当中难免list存在嵌套的情况,通常的实现方式是使用两个for循环嵌套,这样使得执行步骤增加,大大降低了系统的性能。
项目背景: 存在te_questionmain表和te_questionsub表,是一对多的关系,学生段抽题从这两张表中根据papermain字段将List<Questionmain>和List<Questionsub>全部查出来,为了保证数据不重复,不适用sql的连接表查询语句;系统应用的java版本是1.7,因此不具备1.8以后的list筛选功能。实现方式只能是查出两个list集合以后,将List<Questionsub>插入到对应的List<QuestionMain>当中。
使用两层for循环的实现的方式:
List<Questionmain> questionmains2=new ArrayList<Questionmain>();
for(Questionmain questionmain:questionmains){
for(Questionsub questionsub:questionsubs){
List<Questionsub>questionsubs2=new ArrayList<Questionsub>();
if(questionsub.getQuestionmainID.equals(questionmain.getId)){
questionsubs2.put(quesionsub);
}
questionmain.setQuestionsubList(questionsubs2)
}
}
使用mutimap的实现方式:
//将questionsub放到multimap中
Multimap<String,QuestionSub>quetionSubMutimap=ArrayListMultimap.create();
Iterator iterator =questionSubs.iterator();
while(iterator.hasNext()){
QuestionSub questionSub=(QuestionSub)iterator.next();
quetionSubMutimap.put(questionSub.getPaperMainId(), questionSub);
}
Iterator iterator2=questionMains.iterator();
while(iterator2.hasNext()){
QuestionMain questionMain=(QuestionMain)iterator2.next();
List<QuestionSub>questionSubs3=new ArrayList<QuestionSub>();
// 将collection中存在的questionsub实体放入到list中
if(quetionSubMutimap.containsKey(questionMain.getId())){
Collection<QuestionSub>questionSubs2=quetionSubMutimap.get(questionMain.getId());
for (QuestionSub questionSub : questionSubs2) {
questionSubs3.add(questionSub);
}
}
questionMain.setQuestionsubList(questionSubs3);
}
从该实例中我们可以看出multimap是一个id对应多个实体,且在存放的过程中自动将实体进行归类,形成格式是Multimap<String,Collection<T>>.
详细的multimap使用方法请参照:《Guava 之 Multimap 用法简介》