当前位置: 首页 > 知识库问答 >
问题:

Java8-如何通过使用方法抽象谓词的使用

公孙涵育
2023-03-14

我试图创建一个从最终用户抽象谓词使用的类。

我的应用程序使用了番石榴重试扩展,效果很好。

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个答案

丁勇
2023-03-14

看来你真的不懂谓语。谓词是一个函数,它将输入作为参数,并返回布尔值(当然,通常基于输入)。

让我们检查一下您的Poll条件类:

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

因此,它定义了一个抽象的condition()方法,该方法不以任何内容作为参数,并返回一个布尔值。可以使用getCondition()将其“转换”为谓词。此方法返回一个谓词,该谓词将输入作为参数(结果),完全忽略它,并始终返回由condition()返回的布尔值。

然后,您可以使用以下方法创建一个Poll条件

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

如果在执行该代码的范围内有一个名为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));
 类似资料:
  • 问题内容: 我有一个清单,我想分成几个小清单。 说出所有包含“ aaa”的项目,所有包含“ bbb”的项目以及更多谓词。 我该如何使用java8? 我看到了这篇文章,但只拆分为2个列表。 我看到了这篇文章,但是在Java 8之前已经很老了。 问题答案: 就@RealSkeptic中解释的那样,注释只能返回两个结果:true和false。这意味着您将只能将数据分为两组。 您需要的是某种可以让您确定应

  • 有两个具有相同结构的地图,即map1和map2,其结构为

  • 我试图给出一个完整的答案: "为什么/何时使用抽象类而不是接口。" 并寻找以下方面的验证/建议。 对此的一个答案是, 在具体类来定义特定类型之前,抽象类通常位于继承层次结构中接口的正下方(就像Java API中的许多示例一样),实现并固定接口定义的结构的一些公共方面。 使用抽象类的另一个很好的理由是类型之间有一个清晰的逻辑层次结构。抽象类具有组织层次结构的作用,同时通过作为抽象类而不是具体类,迫使

  • 在Java 8中,您可以使用方法引用来过滤流,例如: 有没有一种方法可以创建一个方法引用,它是现有方法引用的否定,例如: 我可以像下面这样创建方法,但我想知道JDK是否提供了类似的东西。

  • 问题内容: 在Java8中,可以使用方法引用来过滤流,例如: 是否有方法创建一个方法引用,该方法引用是对现有方法引用的否定,例如: 我可以创建如下的方法,但我想知道JDK是否提供了类似的功能。 问题答案: Predicate.not( … ) java-11提供了一个新的方法谓词 因此可以否定方法引用:

  • 这是我的家长课 然后我创建了一个列表 然后我向objList添加了许多父对象。 现在我想根据类中字段的值过滤这些对象。但是我只会动态地得到字段名。我想为此使用流。 这里getAttrib2()有所不同。它可以是getAttrib1()或getAttrib3()。 所以我需要动态函数调用。我们能用谓词实现它吗。不幸的是,我对谓词对象一无所知。请详细解释你的答案,里面有所有的概念。