需求:从远程数据库获取数据,与本库数据进行比对,无则新增,有则更新。
javabean:
@Data
@AllArgsConstructor
public class SfSfjl
{
/**
* 房间编号
*/
private String houseCode;
/**
* readDate
*/
private Date readDate;
/**
* pHeat
*/
private Double pHeat;
/**
* insDel
*/
private Double insDel;
/**
* swTemp
*/
private Double swTemp;
/**
* rwTemp
*/
private Double rwTemp;
/**
* mTime
*/
private String mTime;
}
若2个for循环嵌套遍历对比的话,那效率是惨不忍睹的...
@Test
public void tes()
{
List sfjllist = ...;
List sfjllist1 = ...;
for (SfSfjl s : sfjllist)
{
System.out.println("循环1");
for (SfSfjl s1 : sfjllist1)
{
System.out.println("循环2");
}
}
}
所以采用以下方式高效率的执行业务。
@Test
public void test()
{
// 远程数据库数据
List remoteList = new ArrayList<>();
remoteList.add(new SfSfjl("0001", new Date(new java.util.Date().getTime()), 1.0D, 2.0D, 3.0D, 4.0D, ""));
remoteList.add(new SfSfjl("0002", new Date(new java.util.Date().getTime()), 1.0D, 2.0D, 3.0D, 4.0D, ""));
remoteList.add(new SfSfjl("0003", new Date(new java.util.Date().getTime()), 1.0D, 2.0D, 3.0D, 4.0D, ""));
remoteList.add(new SfSfjl("0004", new Date(new java.util.Date().getTime()), 1.0D, 2.0D, 3.0D, 4.0D, ""));
remoteList.add(new SfSfjl("0005", new Date(new java.util.Date().getTime()), 1.0D, 2.0D, 3.0D, 4.0D, ""));
// 本地数据库数据
List localList = new ArrayList<>();
localList.add(new SfSfjl("0001", new Date(new java.util.Date().getTime()), 0.0D, 0.0D, 0.0D, 0.0D, ""));
localList.add(new SfSfjl("0002", new Date(new java.util.Date().getTime()), 0.0D, 0.0D, 0.0D, 0.0D, ""));
localList.add(new SfSfjl("0003", new Date(new java.util.Date().getTime()), 0.0D, 0.0D, 0.0D, 0.0D, ""));
// 远程库与本地库匹配的数据
List duplicatedList = new ArrayList<>();
// 将远程数据库的list转为Map,key为houseCode,需唯一
Map remoteMap = remoteList.stream().collect(Collectors.toMap(sfSfjl -> sfSfjl.getHouseCode(), sfSfjl -> sfSfjl));
// 遍历本地的list,根据本地数据的houseCode取得与houseCode匹配的远程数据
localList.forEach(localSfSfjl ->
{
// 根据houseCode取得远程的对象
SfSfjl duplicatedSfSfjl = remoteMap.get(localSfSfjl.getHouseCode());
if (!ObjectUtils.isEmpty(duplicatedSfSfjl))
{
duplicatedList.add(duplicatedSfSfjl);
}
});
// 遍历需更新的数据,并从远程数据库的list中删除
duplicatedList.forEach(updateData ->
{
// TODO: 2019/1/10 更新数据
System.out.println("更新的数据:" + updateData.toString());
remoteList.remove(updateData);
});
// 遍历需新增的数据
remoteList.forEach(insertData ->
{
// TODO: 2019/1/10 新增数据
System.out.println("新增的数据:" + insertData.toString());
});
}