List嵌套查询获取2个list中主键相同的数据

需求:从远程数据库获取数据,与本库数据进行比对,无则新增,有则更新。

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<SfSfjl> 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<SfSfjl> 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<SfSfjl> duplicatedList = new ArrayList<>();

        // 将远程数据库的list转为Map,key为houseCode,需唯一
        Map<String, SfSfjl> 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());
        });
    }

猜你喜欢

转载自blog.csdn.net/sinat_30637097/article/details/86233418