1. 背景
现在日常工作中经常会遇到两组数据对比碰撞的需求,菜菜不才,之前写了一个不怎么优雅的代码才解决了问题,而且还是只能对比String的,菜菜有空后赶紧写了一个比较优雅的方式解决了list比对的问题。
2. 代码
2.1 原始版本
/**
* 两个List对比
* @param listA
* @param listB
* @return repeatList A与B的重复数据
* @return returnList A与B的不重复数据
*/
public static Map<String,List<String>> stringIntersectionDelete(List<String> listA, List<String> listB){
//返回一个map,一个是去重后的list,一个是被删除的list
Map<String,List<String>> returnMap=new HashMap<>(16);
List<String> repeatList=new ArrayList<>();
for (Iterator<String> itA = listA.iterator(); itA.hasNext();)
{
String temp = itA.next();
// itA.next() 只能在外层循环里面调用1次
for (int i = 0; i < listB.size(); i++)
{
if (temp.equals(listB.get(i)))
// 你不该在这里多次调用itA.next()的
{
repeatList.add(temp);
itA.remove();
}
}
}
returnMap.put("repeatList",repeatList);
returnMap.put("returnList",listA);
return returnMap;
}
2.2 改良版本
List<String> list1 = Arrays.asList("123", "456", "789", "987", "654", "321","222");
List<String> list2 = Arrays.asList("123", "456", "789");
//核心代码
Map<Boolean, List<String>> collect = list1.stream().collect(Collectors.partitioningBy(obj ->
list2.stream().anyMatch(obj2 -> obj.equals(obj2))
));
System.out.println(collect);
3. 结语
可以看到改良后的代码是比较优雅的,必经就两行。内部底层也是使用了两层for所以时间维度上是一样的,简介度却高了很多,最主要的是,还可以用在Object 上,只要挑出对比值,或者整个对象toString对比即可,使用程度也是有提升的。所以还是要多看一点新特性啊。