Java 8 Stream比较两个对象的列表

时间:2018-05-15 16:14:54

标签: java java-stream

我正在寻找一个示例来过滤两个列表并创建一个仅包含基于条件的子集的列表。例如

  • List-1包含用户对象列表
  • List-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 :(得分:2)

问题不在于您的逻辑,而在于将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);