对比两个List,区分重复数据(优化)。

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对比即可,使用程度也是有提升的。所以还是要多看一点新特性啊。

你可能感兴趣的:(java,Spring,java,哈希算法,开发语言)