Java 8 Stream сравнивает список двух объектов - PullRequest
0 голосов
/ 15 мая 2018

Я ищу пример для фильтрации двух списков и создания списка, который содержит только подмножество на основе условия.Например,

  • Список-1 содержит список объектов пользователя
  • Список-2 содержит список PaidUser

Теперь мне нужно отфильтровать и подготовить списокнеоплачиваемых пользователей.Ниже код выдает список со всеми элементами, но ожидается только «ABC».Пожалуйста, помогите

    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());

1 Ответ

0 голосов
/ 15 мая 2018

Проблема не в вашей логике, а в том, как вы добавляете User в свой список ввода.

После добавления объекта вы изменяете тот же объект и добавляете ту же ссылку

 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...