Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8流比较两个对象的列表_Java_Java Stream - Fatal编程技术网

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的列表
现在,我需要筛选并准备一个未付费用户列表。下面的代码包含所有元素,但期望值仅为“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());
类用户{
私有字符串用户名;
私弦时代;
公共字符串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(..),它可以为我获得所需的输出