java8 - 如何通过使用方法抽象谓词的使用
java 8 - how abstracts the use of predicates by using methods
我正在尝试创建一个 class 从最终用户那里抽象出谓词的使用。
我的应用程序使用 Guava-Retrying 扩展程序,效果很好。
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfResult(Predicates.<Boolean>isNull())
....
.build();
retryer.call(callable);
我可以很容易地用谓词调用它,它会轮询直到谓词 returns false。
现在,也许我误解了谓词,但我正在尝试创建一个 class 来抽象它们。
我想这样称呼它
MyPoller.poll(new PollCondition<MyClass>() {
@Override public boolean condition() {
return !isValid(result**.getPermissions(), permissionName);
}
});
所以我写了PollConditionclass如下
public abstract class PollCondition<T> {
public Predicate<T> getCondition() {
return result -> condition();
}
public abstract boolean condition();
}
但 MyPoller.poll() 调用无法编译 - 结果未声明。
有什么想法吗?
看来你确实不了解谓词。谓词是一个将输入作为参数的函数,returns 一个布尔值(当然通常基于输入)。
让我们检查一下您的 PollCondition class:
public abstract class PollCondition<T> {
public Predicate<T> getCondition() {
return result -> condition();
}
public abstract boolean condition();
}
所以它定义了一个抽象的 condition()
方法,它不接受任何参数,returns 一个布尔值。并且它可以 "transformed" 变成一个使用 getCondition()
的谓词。此方法 returns 一个将输入作为参数(结果)的谓词,完全忽略它,并且始终 returns condition()
返回的布尔值。
然后您使用
创建一个 PollCondition
new PollCondition<MyClass>() {
@Override public boolean condition() {
return !isValid(result.getPermissions(), permissionName);
}
}
如果在您执行该代码的范围内有一个名为 result
的变量,那将是正确的。但是没有。 result
实际上是对您的条件的输入。所以 class 实际上应该这样定义:
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));
我正在尝试创建一个 class 从最终用户那里抽象出谓词的使用。
我的应用程序使用 Guava-Retrying 扩展程序,效果很好。
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfResult(Predicates.<Boolean>isNull())
....
.build();
retryer.call(callable);
我可以很容易地用谓词调用它,它会轮询直到谓词 returns false。
现在,也许我误解了谓词,但我正在尝试创建一个 class 来抽象它们。
我想这样称呼它
MyPoller.poll(new PollCondition<MyClass>() {
@Override public boolean condition() {
return !isValid(result**.getPermissions(), permissionName);
}
});
所以我写了PollConditionclass如下
public abstract class PollCondition<T> {
public Predicate<T> getCondition() {
return result -> condition();
}
public abstract boolean condition();
}
但 MyPoller.poll() 调用无法编译 - 结果未声明。
有什么想法吗?
看来你确实不了解谓词。谓词是一个将输入作为参数的函数,returns 一个布尔值(当然通常基于输入)。
让我们检查一下您的 PollCondition class:
public abstract class PollCondition<T> {
public Predicate<T> getCondition() {
return result -> condition();
}
public abstract boolean condition();
}
所以它定义了一个抽象的 condition()
方法,它不接受任何参数,returns 一个布尔值。并且它可以 "transformed" 变成一个使用 getCondition()
的谓词。此方法 returns 一个将输入作为参数(结果)的谓词,完全忽略它,并且始终 returns condition()
返回的布尔值。
然后您使用
创建一个 PollConditionnew PollCondition<MyClass>() {
@Override public boolean condition() {
return !isValid(result.getPermissions(), permissionName);
}
}
如果在您执行该代码的范围内有一个名为 result
的变量,那将是正确的。但是没有。 result
实际上是对您的条件的输入。所以 class 实际上应该这样定义:
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));