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