java 8 - 如何通过使用方法来抽象谓词的使用

问题描述 投票:0回答:1

我正在尝试创建一个类,从最终用户那里抽象出谓词的使用。

我的应用程序使用 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() 调用无法编译 - 结果未声明。

有什么想法吗?

java-8 predicate
1个回答
3
投票

看来你确实不理解谓词。谓词是一个函数,它接受输入作为参数,并返回一个布尔值(当然通常基于输入)。

让我们检查一下您的

PollCondition
课程:

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

因此它定义了一个抽象的

condition()
方法,该方法不接受任何内容作为参数,并返回一个布尔值。并且可以使用
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);
    }
}

但是我真的真的不明白直接使用简单的谓词会带来什么。

像这样定义

MyPoller.poll()

public poll(Predicate<T> predicate);

并像这样使用它:

MyPoller.poll(result -> !isValid(result.getPermissions(), permissionName));
© www.soinside.com 2019 - 2024. All rights reserved.