Reputation: 113
I am looking for an example to filter two lists and create a list that contains only a subset based on condition. For example
Now I need to filter and prepare a list of unpaid users. Below code produce list with all elements but expectation is only "ABC" . Please assist
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());
Upvotes: 0
Views: 572
Reputation: 17890
The issue is not with your logic rather in the way you add User
to your input list.
After you add an object, you mutate the same object and add the same reference
users.add(u);
u.age = "12";
u.userName = "ABC";
users.add(u);
After executing the above lines your list has the same User
reference twice (User
with name ABC
and age 12).
Change it to
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);
Upvotes: 2