Abdul Jabbar
Abdul Jabbar

Reputation: 113

Java 8 Stream compare list of two objects

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

Answers (1)

Thiyagu
Thiyagu

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

Related Questions