首页 > 编程语言 >Java中过滤出ListA和ListB中字段相同的集合

Java中过滤出ListA和ListB中字段相同的集合

时间:2023-07-30 12:32:03浏览次数:45  
标签:Java name 中字段 gender age User ListA public String

Java中过滤出ListA和ListB中age字段相同的User集合

在Java中,List是一种常见的集合类型,它可以用来存储一组有序的数据。而对于List中存储的对象类型,我们可以使用泛型来进行限定。

假设我们现在有两个List集合,分别为ListA和ListB,它们都存储了一些User对象。现在我们需要从这两个集合中过滤出那些age字段相同的User对象,这个过程可以通过Java Stream API来实现。

User类的定义

在开始之前,我们需要先定义一下User类,用来表示ListA和ListB中存储的对象类型。User类中包含了三个字段:name、age和gender,分别表示用户的姓名、年龄和性别。

public class User {
    private String name;
    private int age;
    private String gender;

    public User(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

ListA和ListB的初始化

接下来我们需要初始化ListA和ListB,这里我们使用了Java 8提供的新特性Stream API中的of方法来快速创建List集合。

List<User> listA = Stream.of(
        new User("张三", 18, "男"),
        new User("李四", 20, "男"),
        new User("王五", 22, "女")
).collect(Collectors.toList());

List<User> listB = Stream.of(
        new User("赵六", 18, "女"),
        new User("孙七", 20, "男"),
        new User("周八", 22, "女")
).collect(Collectors.toList());

过滤出age字段相同的User集合

现在我们已经有了ListA和ListB两个集合,下一步我们需要从这两个集合中过滤出那些age字段相同的User对象。

方法一:使用Java 8的新特性Lambda表达式进行过滤

使用Java 8的新特性Lambda表达式进行过滤的思路是使用Stream API中的flatMap方法将ListA和ListB合并成一个流,然后使用filter方法过滤出年龄相同的User对象,最后使用collect方法将过滤结果收集到一个新的List集合中。

具体来说,我们可以使用Stream API中的filter方法来进行过滤,并且将过滤结果收集到一个新的List集合中。代码如下:

List<User> result = listA.stream()
        .filter(a -> listB.stream()
                .anyMatch(b -> b.getAge() == a.getAge()))
        .collect(Collectors.toList());

在上述代码中,我们首先对listA进行了stream操作,然后使用filter方法来过滤出那些满足条件的User对象。在filter方法中,我们使用了listB的stream操作,并且使用anyMatch方法来判断listB中是否存在与当前User对象age字段相同的对象。

最后,我们将过滤结果收集到一个新的List集合中,并将其赋值给result变量。这个result变量就是我们需要的age字段相同的User集合。

方法二:使用循环进行过滤

使用循环进行过滤的思路是遍历ListA中的每一个元素,然后再遍历ListB中的每一个元素,判断它们的年龄是否相同。如果相同,则将该User对象添加到结果集合中。

List<User> result = new ArrayList<>();
for(User a : listA) {
    for(User b : listB) {
        if(a.getAge() == b.getAge()) {
            result.add(a);
        }
    }
}

完整代码

下面是完整的Java代码,用来演示如何从ListA和ListB中过滤出那些age字段相同的User对象。

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

public class Main {
    public static void main(String[] args) {
        List<User> listA = Stream.of(
                new User("张三", 18, "男"),
                new User("李四", 20, "男"),
                new User("王五", 22, "女")
        ).collect(Collectors.toList());

        List<User> listB = Stream.of(
                new User("赵六", 18, "女"),
                new User("孙七", 20, "男"),
                new User("周八", 22, "女")
        ).collect(Collectors.toList());

        List<User> result = listA.stream()
                .filter(a -> listB.stream()
                        .anyMatch(b -> b.getAge() == a.getAge()))
                .collect(Collectors.toList());

        System.out.println(result);


	// 方法二
	List<User> result1 = new ArrayList<>();
	for(User a : listA) {
    		for(User b : listB) {
        		if(a.getAge() == b.getAge()) {
            			result.add(a);
        		}
    		}
	}
        System.out.println(result1);
    }
}

class User {
    private String name;
    private int age;
    private String gender;

    public User(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

运行结果

最后,我们可以运行上述代码,得到如下的运行结果:

[User{name='张三', age=18, gender='男'}, User{name='李四', age=20, gender='男'}]
[User{name='张三', age=18, gender='男'}, User{name='李四', age=20, gender='男'}]

从运行结果中可以看出,过滤出的结果是ListA和ListB中age字段相同的User对象集合。其中,张三和李四的age字段都是18和20,分别与ListB中的赵六和孙七的age字段相同。这说明我们的过滤操作是正确的。

总结

在本文中,我们介绍了如何使用Java Stream API来过滤出ListA和ListB中age字段相同的User对象集合。具体来说,我们使用了Stream API中的filter和anyMatch方法,以及Collectors.toList方法来实现此功能。希望本文能对大家有所帮助。

标签:Java,name,中字段,gender,age,User,ListA,public,String
From: https://blog.51cto.com/u_15399050/6899735

相关文章

  • JavaScript、ECMA、CommonJs、NodeJS、TypeScript的关系
    返回JavaScript发布时间:1995发布公司:Netscape(网景)它是一种高级的解释型编程语言,简称JS它最初的设计目标是改善网页的用户体验。......
  • 设计模式-迭代器模式在Java中使用示例
    场景为开发一套销售管理系统,在对该系统进行分析和设计时,发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,开发人员设计了一个抽象的数据集合类AbstractObjectList,而将存储商品和客户等数据的类作为其子类AbstractObjectList类的子类ProductList和Custo......
  • Java的readBytes是怎么实现的?
    1.前言众所周知,Java是一门跨平台语言,针对不同的操作系统有不同的实现。本文从一个非常简单的api调用来看看Java具体是怎么做的.2.源码分析从FileInputStream.java中看到readBytes最后是native调用/***Readsasubarrayasasequenceofbytes.*@parambtheda......
  • 【Java】《2小时搞定多线程》个人笔记
    简介基于慕课网站上的一个一元钱课程《2小时搞定多线程》的个人笔记。线程的起源我们先来看看网络中关于线程起源的说明,理解线程的来龙去脉对于掌握多线程有一定帮助。此部分内容整理自下面两篇网络博客:#线程是什么#线程的起源线程的起源与计算机的发展息息相关。早期的计算机系......
  • VarHandle:Java9中保证变量读写可见性、有序性、原子性利器
    文章目录一、什么是VarHandle0、JMM1、jdk9之前无锁技术的实现二、VarHandle使用1、VarHandle快速上手2、VarHandle常用方法3、实战案例1:解决可见性(比volatile轻量)4、实战案例2:解决指令重排序(比volatile轻量)(1)案例分析:partialordering(2)案例分析:totalordering一、什么是VarHand......
  • Dubbo(一)_Java_SPI
    什么是SPI?Dubbo的源码中大量涉及了JavaSPI设计思想,所以理解SPI对理解Dubbo源码有很大帮助。JavaSPI全称JavaServiceProviderInterface,是Java提供的一种服务提供者发现机制。其核心功能是通过接口找到其实现类。在实际运用中,主要用在程序启动或者运行时,通过SPI机......
  • 4.JAVA的特性和优势
    4.JAVA的特性和优势跨平台/可移植性这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。安全性Java适合于网络/分布式环境,为了达到这个目标,在安全性......
  • JAVA体系结构
    JAVA体系结构JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。在上世纪90年代末互联网上大放异......
  • Java面试题 P16:Redis篇:Redis使用场景-缓存-缓存穿透
    缓存涉及问题:1、缓存三兄弟:穿透击穿雪崩2、双写一致3、持久化4、数据过期策略5、数据淘汰策略如果发生了缓存穿透,击穿,雪崩,该如何解决?1、缓存穿透什么是缓存穿透,当查询一个不存在的数据,查redis中没有,mysql查询也没有,数据也不会直接写入到redis,就导致每次都要请求数据库,......
  • 【Java】使用fastjson进行序列化时出现空指针异常问题研究
    最近在使用fastjson的JSONObject.toJSONString()方法将bean对象转为字符串的时候报如下错误:com.alibaba.fastjson.JSONException:writejavaBeanerror,fastjsonversion1.2.58,classcom.sun.proxy.$Proxy395,fieldName:0 atcom.alibaba.fastjson.serializer.JavaBeanS......