java 8 - 如何使用方法

时间:2015-07-26 09:07:20

标签: java-8 predicate

我正在尝试创建一个抽象使用来自最终用户的谓词的类。

我的应用使用Guava-Retrying扩展程序,效果很好。

Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
     .retryIfResult(Predicates.<Boolean>isNull())
     ....
     .build();
retryer.call(callable);

我可以通过谓词轻松调用它并轮询直到谓词返回false。

现在,也许我误解了谓词,但我正在尝试创建一个抽象它们的类。

我希望将其称为如下

MyPoller.poll(new PollCondition<MyClass>() {
        @Override public boolean condition() {
            return !isValid(result**.getPermissions(), permissionName);
        }
    });

所以我写了PollCondition类如下。

public abstract class PollCondition<T> {
  public Predicate<T> getCondition() {
      return result -> condition();
  }
  public abstract boolean condition();
} 

但MyPoller.poll()调用无法编译 - 未声明结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

你似乎并不理解谓词。谓词是一个以输入为参数的函数,并返回一个布尔值(当然,通常基于输入)。

让我们检查你的PollCondition课程:

public abstract class PollCondition<T> {
  public Predicate<T> getCondition() {
      return result -> condition();
  }
  public abstract boolean condition();
} 

因此它定义了一个抽象的condition()方法,它不会将任何东西作为参数,并返回一个布尔值。并且它可以被转换&#34;使用getCondition()进入谓词。此方法返回一个谓词,该谓词将输入作为参数(结果),完全忽略它,并始终返回condition()返回的布尔值。

然后使用

创建一个PollCondition
new PollCondition<MyClass>() {
    @Override public boolean condition() {
        return !isValid(result.getPermissions(), permissionName);
    }
}

如果在执行该代码的范围内有一个名为result的变量,那将是正确的。但事实并非如此。 result实际上是您病情的输入。所以这个类实际上应该这样定义:

public abstract class PollCondition<T> {
  public Predicate<T> getCondition() {
      return result -> condition(result);
  }
  public abstract boolean condition(T result);
} 

然后您就可以使用

实例化一个
new PollCondition<MyClass>() {
    @Override public boolean condition(MyClass result) {
        return !isValid(result.getPermissions(), permissionName);
    }
}

但我真的,真的不知道直接使用简单的Predicate会带来什么。

像这样定义MyPoller.poll():

public poll(Predicate<T> predicate);

并像这样使用它:

MyPoller.poll(result -> !isValid(result.getPermissions(), permissionName));