项目场景:
微服务查询的时候检查需要在代码对两个表进行关联,平时一直都是两个for来匹配设置的,问题描述:
微服务查询的时候检查需要在代码对两个表进行关联,平时一直都是两个for来匹配设置的,但是感觉这样代码就太难看了if (!CollectionUtils.isEmpty(empIdList)){
//通过id去 user服务取到全部员工 然后再代码中匹配
List<EmpDTO> empList = userFeignService.getEmpByIds(empIdList);
if (!CollectionUtils.isEmpty(empList)){
for (UserDetailDTO user:userDetailList){
for (EmpDTO emp:empList){
if (emp.getId().equals(user.getEmpId())){
user.setEmpDTO(emp);
break;
}
}
}
}
}
解决方案:
网上也一直找不到什么能用的轮子,后面自己捣鼓了一下匿名函数式和lambda表达式,整了一个雏形版的匹配方法,具体如下所示
/**
* 匹配两个集合并设置
* @param t 设置的集合
* @param ft t的匹配字段
* @param r 资源集合
* @param fr r的匹配字段
* @param fs 设置的方法
* @param <T> 目标集合
* @param <R> 筛选集合
* @param <M> 匹配的项的类型
*/
public static <T, R, M> void matchAndSet(List<T> t, Function<T, M> ft, List<R> r, Function<R, M> fr, KeyValueStreamingChannel<T,R> fs){
for (T a:t){
for (R b:r){
if (ft.apply(a).equals(fr.apply(b))){
fs.onKeyValue(a, b);
}
}
}
}
这里是一个简单的使用例子
if (!CollectionUtils.isEmpty(empIdList)){
//通过id去 user服务取到全部员工 然后再代码中匹配
List<EmpDTO> empList = userFeignService.getEmpByIds(empIdList);
if (!CollectionUtils.isEmpty(empList)){
ListUtil.matchAndSet(userDetailList, UserDetailDTO::getEmpId, empList, EmpDTO::getId, UserDetailDTO::setEmpDTO);
}
}