【问题标题】:Java List stream anyMatch returning incorrect result [duplicate]Java List流anyMatch返回不正确的结果[重复]
【发布时间】:2014-08-09 11:24:33
【问题描述】:

我有一个 JPA 类“项目”,它有一个 'Employee' 列表,getEmployeeList() 返回 Employees 列表。

public  class Project implements Serializable {

    @ManyToMany(targetEntity=Employee.class)
    private List<Employee> employeeList;

    public List<Employee> getEmployeeList() {
        return this.employeeList;
    }
}

public  class Employee implements Serializable {
    @Basic
    private EmployeeType type;

    public EmployeeType getType() {
        return this.type;
    }
}

public enum EmployeeType implements Serializable{
  EDITOR,
  AUDITOR,
  ADMIN,
  INACTIVE
}

我有一个“审计员”类型的员工,当我运行以下命令时

for(Employee e: p.getEmployeeList()){
     if(e.getType()==EmployeeType.AUDITOR)
         found=true;
 }

它应该返回true,但是当我运行时

(p.getEmployeeList()).stream().anyMatch((e) -> (e.getType()==EmployeeType.AUDITOR))

它返回错误

我做错了什么?

【问题讨论】:

  • 他在比较枚举变量,所以不应该这样工作吗?代码对我来说似乎很好,即使它有不必要的括号 p.getEmployeeList().stream().anyMatch(e -&gt; e.getType() == EmployeeType.AUDITOR) 也可以。
  • 是的,你的权利。我要删除评论。
  • 您确定p.getEmployeeList() 不会返回空列表吗?如果是这样,found 将保持其初始值(可能您错误地初始化为 true),而根本不进入循环,但 anyMatch 将返回 false。
  • 我的 found 初始值为 false,我在同一个数据集上运行循环和 anyMatch,因此它应该返回相同的结果。
  • 尝试在anyMatch() 之前将.peek(System.out::println) 放入流中,以查看实际输入的内容。

标签: java jpa arraylist java-8 java-stream


【解决方案1】:

解决办法——将返回类型改为arraylist

public ArrayList<Employee> getEmployeeList() {
    return new ArrayList<>(this.employeeList);
}

【讨论】:

    【解决方案2】:

    更新你的 EclipseLink 版本,这个 bug 已经修复了!

    错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=433075

    更新到 2.6.0 或更高版本:http://mvnrepository.com/artifact/org.eclipse.persistence/eclipselink/2.6.0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多