stream 对集合处理 交集,并集,差集

该代码示例展示了Java中如何使用Stream API进行集合的并集、差集操作,以及对象列表的交集和差集处理。通过filter和contains方法实现集合间的操作,并讨论了并行流可能导致的线程安全问题。
摘要由CSDN通过智能技术生成
package com.example.demo.test;

import org.apache.commons.compress.utils.Lists;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 集合处理
 */
public class streamTest3 {

    public static void main(String[] args) {
        List<String> list1 = Lists.newArrayList();
        list1.add("1111");
        list1.add("2222");
        list1.add("3333");

        List<String> list2 = Lists.newArrayList();
        list2.add("3333");
        list2.add("4444");
        list2.add("5555");

        // 并集
        List<String> intersection=list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
        System.out.println("====== 并集 ======");
        intersection.stream().forEach(System.out::println);

        // 差集 (list1 - list2)
        List<String> reduce1 =list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
        System.out.println("===== 差集 ======");
        reduce1.stream().forEach(System.out::println);

        // 差集 (list1 - list2)
        List<String> reduce2=list2.stream().filter(item -> !list1.contains(item)).collect(Collectors.toList());
        System.out.println("===== 差集 =====");
        reduce2.stream().forEach(System.out::println);

        // 并集  一般有filter 操作时,不用并行流parallelStream ,如果用的话可能会导致线程安全问题
        List<String> listAll=list1.parallelStream().collect(Collectors.toList());
        List<String> listAll2=list2.parallelStream().collect(Collectors.toList());
        listAll.addAll(listAll2);
        System.out.println("===== 并集 =====");
        listAll.stream().forEach(System.out::println);

        // 去重并集
        List<String> listAllDistinct=listAll.stream().distinct().collect(Collectors.toList());
        System.out.println("===== 去重并集 =====");
        listAllDistinct.stream().forEach(System.out::println);


        List<Student> list= Lists.newArrayList();
        Student info=new Student();
        info.setAge(20);
        info.setName("小米");
        info.setNumber(1457);
        info.setClazz("14");
        Student info1=new Student();
        info1.setAge(20);
        info1.setName("张三");
        info1.setNumber(1458);
        info1.setClazz("14");
        Student info2=new Student();
        info2.setAge(20);
        info2.setName("小s");
        info2.setNumber(1459);
        info2.setClazz("14");
        Student info3=new Student();
        info3.setAge(20);
        info3.setName("迈克尔");
        info3.setNumber(1460);
        info3.setClazz("14");
        list.add(info);
        list.add(info1);
        list.add(info2);
        list.add(info3);

        List<Student> list3= Lists.newArrayList();
        Student s1=new Student();
        s1.setAge(20);
        s1.setName("小米");
        s1.setNumber(1457);
        s1.setClazz("14");
        Student s2=new Student();
        s2.setAge(20);
        s2.setName("张三");
        s2.setNumber(1458);
        s2.setClazz("14");
        Student s3=new Student();
        s3.setAge(20);
        s3.setName("詹姆斯");
        s3.setNumber(1501);
        s3.setClazz("15");
        list3.add(s1);
        list3.add(s2);
        list3.add(s3);
        //交集
        List<Student> intersectionObj = list.stream().filter(item -> list3.contains(item)).collect(Collectors.toList());
        System.out.println("============== 交集 =============");
        intersectionObj.stream().forEach(System.out::println);
        // 差集 (list - list2)
        List<Student> reduceObj1 =list.stream().filter(item -> !list3.contains(item)).collect(Collectors.toList());
        System.out.println("===== 差集 ======");
        reduceObj1.stream().forEach(System.out::println);




    }

}

class Student{
    private Integer number;

    private String name;

    private Integer age;

    private String clazz;

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getClazz() {
        return clazz;
    }

    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
    //List里面装的是对象 一定要重写equals和hashcode方法。不然是比较的堆的内存地址
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return number.equals(student.number) &&
                name.equals(student.name) &&
                age.equals(student.age) &&
                clazz.equals(student.clazz);
    }

    @Override
    public int hashCode() {
        return Objects.hash(number, name, age, clazz);
    }

    @Override
    public String toString() {
        return "Student{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", clazz='" + clazz + '\'' +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值