java8判断两个集合中是否有相同的元素

比如这样一个需求,现有一个Teacher对象集合和一个Student对象集合,需要查出两个集合中姓名相同的记录该怎么办呢,通常我们想到的肯定是用双层for循环来做,如果用java8新特性lambda表达式怎么做呢?废话不多说,直接看示例:

新建老师类:

package demo;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 老师类
 */
@Data
@AllArgsConstructor
public class Teacher {
    private Long id;
    private String name;
}

新建学生类:

package demo;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 学生类
 */
@Data
@AllArgsConstructor
public class Student {
    private Long id;
    private String name;
}

测试代码:

package demo;

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);
    }
}

测试结果:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值