非对象集合交、并、差处理

对于集合取交集、并集的处理其实有很多种方式,这里就介绍3种

  • 第一种 是CollectionUtils工具类

  • 第二种 是List自带方法

  • 第三种 是JDK1.8 stream 新特性

1、CollectionUtils工具类

下面对于基本数据(包扩String)类型中的集合进行demo示例。

 public static void main(String[] args) {
    String[] arrayA = new String[] { "1", "2", "3", "4"};
    String[] arrayB = new String[] { "3", "4", "5", "6" };
    List listA = Arrays.asList(arrayA);
    List listB = Arrays.asList(arrayB);
 
    //1、并集 union
    System.out.println(CollectionUtils.union(listA, listB));
    //输出: [1, 2, 3, 4, 5, 6]
 
    //2、交集 intersection
    System.out.println(CollectionUtils.intersection(listA, listB));
    //输出:[3, 4]
 
    //3、交集的补集(析取)disjunction
    System.out.println(CollectionUtils.disjunction(listA, listB));
    //输出:[1, 2, 5, 6]
 
    //4、差集(扣除)
    System.out.println(CollectionUtils.subtract(listA, listB));
    //输出:[1, 2]
    }

2、List自带方法

 public static void main(String[] args) {
     String[] arrayA = new String[] { "1", "2", "3", "4"};
     String[] arrayB = new String[] { "3", "4", "5", "6" };
     List listA = Arrays.asList(arrayA);
     List listB = Arrays.asList(arrayB);
 
     //1、交集
     List  jiaoList = new ArrayList<>(listA);
     jiaoList.retainAll(listB);
     System.out.println(jiaoList);
     //输出:[3, 4]
 
     //2、差集
     List  chaList = new ArrayList<>(listA);
     chaList.removeAll(listB);
     System.out.println(chaList);
     //输出:[1, 2]
 
     //3、并集 (先做差集再做添加所有)
     List  bingList = new ArrayList<>(listA);
     bingList.removeAll(listB); // bingList为 [1, 2]
     bingList.addAll(listB);  //添加[3,4,5,6]
     System.out.println(bingList);
     //输出:[1, 2, 3, 4, 5, 6]
  }

注意 : intersection和retainAll的差别

它们的返回类型是不一样的,intersection返回的是一个新的List集合,而retainAll返回是Bollean类型。

那就说明retainAll方法是对原有集合进行处理再返回原有集合,会改变原有集合中的内容。

注意 : Arrays.asList将数组转集合不能进行add和remove操作。

原因:调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的市Arrays的内部类ArrayList, 而不是java.util.ArrayList。

所以正确做法如下

  String[] array = {"1","2","3","4","5"};
  List list = Arrays.asList(array);
  List arrList = new ArrayList(list);
  arrList.add("6");

 3、JDK1.8 stream 新特性

 public static void main(String[] args) {
     String[] arrayA = new String[] { "1", "2", "3", "4"};
     String[] arrayB = new String[] { "3", "4", "5", "6" };
     List listA = Arrays.asList(arrayA);
     List listB = Arrays.asList(arrayB);
 
     // 交集
     List intersection = listA.stream().filter(item -> listB.contains(item)).collect(toList());
     System.out.println(intersection);
     //输出:[3, 4]
 
     // 差集 (list1 - list2)
     List reduceList = listA.stream().filter(item -> !listB.contains(item)).collect(toList());
     System.out.println(reduceList);
     //输出:[1, 2]
 
     // 并集 (新建集合:1、是因为不影响原始集合。2、Arrays.asList不能add和remove操作。
     List listAll = listA.parallelStream().collect(toList());
     List listAll2 = listB.parallelStream().collect(toList());
     listAll.addAll(listAll2);
     System.out.println(listAll);
     //输出:[1, 2, 3, 4, 3, 4, 5, 6]
 
     // 去重并集 
     List list =new ArrayList<>(listA);
     list.addAll(listB);
     List listAllDistinct = list.stream().distinct().collect(toList());
     System.out.println(listAllDistinct);
     //输出:[1, 2, 3, 4, 5, 6]
  }

总结 :第一种方式常用,因为第二种还需要确定该集合是否被多次调用。第三种可读性不高。

你可能感兴趣的:(linux,java)