java8 对比两个 List ,遍历匹配数据的优化处理 支持一对多

 说明:根据云端设备数据集合和数据库设备数据集合,进行对比,本地设备和云端设备相同的,本地数据要进行更新,云端有本地没有的设备,本地要进行新增

//查询数据库 服务商下所有分机数据集合
List<CcExtensionTelephone> dbList = Lists.newArrayList();
//查询云端平台 所有分机信息集合
List<CcExtensionTelephone> cloudList = Lists.newArrayList();
//4.获取集合相同的部分进行更新
List<CcExtensionTelephone> list = compareListData(cloudList, dbList);

/**
 * @param cloudList 云端list
 * @param dbList    数据库list
 * @return List<CcExtensionTelephone>
 * @description: TODO 对两个 List 遍历匹配数据的优化处理
 * @author hyh
 * @date 2022/3/30 16:35
 */
public static List<CcExtensionTelephone> compareListData(List<CcExtensionTelephone> cloudList, List<CcExtensionTelephone> dbList) {
    //两个List 如果ID==CHANNEL_ID  用UUID替换掉CHANNEL_ID
    List<CcExtensionTelephone> resultList = cloudList.stream().map(cloudTel -> dbList.stream()
            .filter(dbTel -> Objects.equals(cloudTel.getExtNumber(), dbTel.getExtNumber()) && Objects.equals(cloudTel.getMac(), dbTel.getMac()))//若云端分机号和本地分机号相同
            .findFirst().map(tel -> {
                Long id = tel.getId();
                BeanUtils.copyProperties(cloudTel, tel);//将cloudList下的数据替换掉本地数据
                tel.setId(id);
                return tel;
            }).orElse(//若云端分机号和本地分机号不相同
                    null))
            .filter(Objects::nonNull).collect(Collectors.toList());
    return resultList;
}
//需要新增的云端分机信息集合
List<CcExtensionTelephone> addTelCloudList = Lists.newArrayList();

//6.云端分机集合去过滤更新的分机集合数据,剩下的即新增分机的集合
addTelCloudList.removeIf(cloudTel -> list.stream().filter(dbTel -> Objects.equals(cloudTel.getExtNumber(), dbTel.getExtNumber()) && Objects.equals(cloudTel.getMac(), dbTel.getMac())).findAny().isPresent());

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个按多个key对两个类型不同的list进行match的通用方法的示例代码: ```java import java.util.*; public class ListMatcher { /** * 根据多个key对两个类型不同的list进行match * @param list1 第一个list * @param list2 第二个list * @param keys 匹配的key列表 * @param <T> 第一个list的元素类型 * @param <U> 第二个list的元素类型 * @return 匹配结果的Map,key为第一个list的元素,value为第二个list的元素 */ public static <T, U> Map<T, U> matchLists(List<T> list1, List<U> list2, String... keys) { Map<T, U> resultMap = new HashMap<>(); Map<List<Object>, U> map2 = new HashMap<>(); for (U element2 : list2) { List<Object> keyList = new ArrayList<>(); for (String key : keys) { try { keyList.add(element2.getClass().getMethod("get" + key.substring(0, 1).toUpperCase() + key.substring(1)).invoke(element2)); } catch (Exception e) { e.printStackTrace(); } } map2.put(keyList, element2); } for (T element1 : list1) { List<Object> keyList = new ArrayList<>(); for (String key : keys) { try { keyList.add(element1.getClass().getMethod("get" + key.substring(0, 1).toUpperCase() + key.substring(1)).invoke(element1)); } catch (Exception e) { e.printStackTrace(); } } resultMap.put(element1, map2.get(keyList)); } return resultMap; } } ``` 这个方法接受两个类型不同的list和一个可变长度的key列表,并返回一个匹配结果的Map,其中key为第一个list的元素,value为第二个list的元素。 在方法中,我们首先创建了一个map2来存储第二个list的元素,key为指定的key列表,value为元素本身。然后遍历第一个list的元素,获取指定key的值,并根据这些值在map2中查找匹配的元素,将结果存储在返回的Map中。 要使用这个方法,只需要将两个list和key列表传递给它即可: ```java List<Person> list1 = new ArrayList<>(); list1.add(new Person("Alice", 25)); list1.add(new Person("Bob", 30)); list1.add(new Person("Charlie", 35)); List<Employee> list2 = new ArrayList<>(); list2.add(new Employee("Alice", "Manager")); list2.add(new Employee("Bob", "Engineer")); list2.add(new Employee("David", "Sales")); Map<Person, Employee> resultMap = ListMatcher.matchLists(list1, list2, "Name"); for (Person key : resultMap.keySet()) { System.out.println(key + " matches " + resultMap.get(key)); } ``` 输出: ``` Person [Name=Alice, Age=25] matches Employee [Name=Alice, Title=Manager] Person [Name=Bob, Age=30] matches Employee [Name=Bob, Title=Engineer] Person [Name=Charlie, Age=35] matches null ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值