java找出两个List集合的重复项

1. 使用 LinkedHashSet

 public static void main(String[] args){
    List<Integer> list1 = new ArrayList<Integer>();
    list1.add(1);
    list1.add(2);
    list1.add(3);
    list1.add(4);
    List<Integer> list2 = new ArrayList<Integer>();
    list2.add(1);
    list2.add(4);
    list2.add(7);
    list2.add(10);
    List<Integer> listAll = new ArrayList<Integer>();
    listAll.addAll(list1);
    listAll.addAll(list2);
    listAll = new ArrayList<Integer>(new LinkedHashSet<>(listAll));
    System.out.println(listAll);
  }

注意在使用listAll.addAll(list1)new LinkedHashSet<>(listAll)中的入参不能为null,否则会报空指针异常
在这里插入图片描述

 

2. java8语法

package Basic.list;

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

public class Java8Test {
    public static void main(String[] args) {
        // 老师集合
        List<Teacher> teachers = Arrays.asList(
                new Teacher(1L, "张三"),
                new Teacher(2L, "李四"),
                new Teacher(3L, "王五"),
                new Teacher(4L, "赵六"));

        // 学生集合
        List<Student> students = Arrays.asList(
                new Student(5L, "张三"),
                new Student(6L, "李四"),
                new Student(7L, "小红"),
                new Student(8L, "小明"));

        // 求同时出现在老师集合和学生集合中的人数,name相同即视为同一个人
        int size = teachers.stream()
                .map(t ->
                        students.stream()
                                .filter(s -> Objects.nonNull(t.getName())
                                        && Objects.nonNull(s.getName())
                                        && Objects.equals(t.getName(), s.getName()))
                                .findAny()
                                .orElse(null))
                .filter(Objects::nonNull)
                .collect(Collectors.toList())
                .size();

        // 求同时出现在老师集合和学生集合中人的name集合,name相同即视为同一个人
        List<String> names = teachers.stream()
                .map(t ->
                        students.stream()
                                .filter(s -> Objects.nonNull(t.getName())
                                        && Objects.nonNull(s.getName())
                                        && Objects.equals(t.getName(), s.getName()))
                                .findAny()
                                .orElse(null))
                .filter(Objects::nonNull)
                .map(r -> r.getName())
                .collect(Collectors.toList());

        System.out.println("相同的人数:" + size);
        System.out.println("相同的人姓名集合:" + names);
    }
}


class Student{
    long id;
    String name;

    public Student(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
class Teacher{
    long id;
    String name;

    public Teacher(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

打印结果:

在这里插入图片描述

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值