我可以在谓词应用方法中评估变量吗?

Lop*_*hin 1 java guava

我最近研究了一个大量使用Guava提供的集合过滤功能的项目,但我发现这样的东西不会产生预期的行为:

  Predicate<ProductClassDTO> secLevelPredicate = new Predicate<ProductClassDTO>() {
    @Override
    public boolean apply(ProductClassDTO pcLevel2) {

      if (pcLevel2.getFatherNodeSid() != null)
        return pcLevel2.getFatherNodeSid() == dto.getSid();
      else
        return false;
    }
  };
Run Code Online (Sandbox Code Playgroud)

dto object是外部循环中的对象,但仍可访问.

返回那个apply方法永远不会得到True,但是如果我用实数来替换dto.getSid(),比如1740,这是父节点数从db得到的,结果很好.

所以我认为我无法在apply()中评估变量?

我注意到apply() javadoc有一行说:

它的执行不会引起任何可观察到的副作用

这应该是这个问题的关键吗?

Jon*_*eet 5

它应该没问题 - 尽管dto如果它在一个方法中并且dto是局部变量,则需要是最终变量.

是否有可能dto.getSid()返回一个Integer而问题是它只是比较引用而不是值?您可以通过使用以下方式使代码更整洁正确:

@Override
public boolean apply(ProductClassDTO pcLevel2) {
  return Objects.equal(pcLevel2.getFatherNodeSid(), dto.getSid());
}
Run Code Online (Sandbox Code Playgroud)