Java 8流比较两个对象的列表
我正在寻找一个示例来过滤两个列表,并根据条件创建一个仅包含子集的列表。比如说Java 8流比较两个对象的列表,java,java-stream,Java,Java Stream,我正在寻找一个示例来过滤两个列表,并根据条件创建一个仅包含子集的列表。比如说 列表-1包含用户对象的列表 列表2包含PaidUser的列表 现在,我需要筛选并准备一个未付费用户列表。下面的代码包含所有元素,但期望值仅为“ABC”。请协助 class User { private String userName; private String age; public String getAge(){ return
- 列表-1包含用户对象的列表
- 列表2包含PaidUser的列表
class User {
private String userName;
private String age;
public String getAge(){
return age;
}
public String getUserName(){
return userName;
}
}
class PaidUser{
private String userName;
private double amt;
public String getUserName(){
return userName;
}
}
List<User> users = new ArrayList<>();
User u = new User();
u.age = "12";
u.userName = "XYZ";
users.add(u);
u.age = "12";
u.userName = "ABC";
users.add(u);
List<PaidUser> paids = new ArrayList<>();
PaidUser paid = new PaidUser();
paid.userName = "XYZ";
paid.amt = 1;
paids.add(paid);
List<User> unpaidUsers = users.stream()
.filter(e -> (!paids.stream()
.anyMatch(p-> p.getUserName().equals(e.getUserName()))))
.collect(Collectors.toList());
类用户{
私有字符串用户名;
私弦时代;
公共字符串getAge(){
回归年龄;
}
公共字符串getUserName(){
返回用户名;
}
}
PaidUser类{
私有字符串用户名;
私人双金额;
公共字符串getUserName(){
返回用户名;
}
}
列表用户=新建ArrayList();
用户u=新用户();
u、 年龄=“12”;
u、 userName=“XYZ”;
用户。添加(u);
u、 年龄=“12”;
u、 用户名=“ABC”;
用户。添加(u);
List paids=new ArrayList();
PaidUser paid=新PaidUser();
paid.userName=“XYZ”;
支付金额=1;
paids.添加(已支付);
List unpaidUsers=users.stream()
.filter(e->(!paids.stream())
.anyMatch(p->p.getUserName().equals(e.getUserName()))
.collect(Collectors.toList());
问题不在于您的逻辑,而在于您将用户添加到输入列表的方式
添加对象后,将对同一对象进行变异并添加相同的引用
users.add(u);
u.age = "12";
u.userName = "ABC";
users.add(u);
执行上述行后,您的列表有两次相同的User
引用(User
,名称为ABC
,年龄为12岁)
换成
User u = new User();
u.age = "12";
u.userName = "XYZ";
users.add(u);
u = new User(); //Create new User object
u.age = "12";
u.userName = "ABC";
users.add(u);
问题不在于您的逻辑,而在于您将用户
添加到输入列表的方式
添加对象后,将对同一对象进行变异并添加相同的引用
users.add(u);
u.age = "12";
u.userName = "ABC";
users.add(u);
执行上述行后,您的列表有两次相同的User
引用(User
,名称为ABC
,年龄为12岁)
换成
User u = new User();
u.age = "12";
u.userName = "XYZ";
users.add(u);
u = new User(); //Create new User object
u.age = "12";
u.userName = "ABC";
users.add(u);
使用paids.stream().noneMatch(p->p.getUserName().equals(e.getUserName())
而不是!paids.stream().anyMatch(p->p.getUserName().equals(e.getUserName())
,前者更适合此任务,可读性更强。感谢非匹配工作使用paids.stream().noneMatch(p->p.getUserName().equals(e.getUserName())
,而不是!paids.stream().anyMatch(p->p.getUserName().equals(e.getUserName())
,前者更适合此任务,可读性更强。感谢noneMatch workedThanks在相同代码中指出错误。根据Aomine使用的noneMatch(..),它可以为我获得所需的输出,以便在同一代码中指出错误。根据Aomine使用的noneMatch(..),它可以为我获得所需的输出