BiPredicate 以及如何使用它

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

希望您今天过得愉快!

我很难理解何时应该使用 BiPredicate 而不是 function

例如,假设我想创建一个简单的字符串验证,如 s1.equals(s2)。当然,我可以创建一个接收两个参数的函数,检查 s1 是否不为空并继续。或者,在我的实用程序类中,创建一个静态最终 BiPredicate,在那里比较它们,然后将其导入到我的主类中,在需要的地方使用。但是如果我在 utils 中而不是 BiPredicate 中创建一个函数,并将其公开,它不是也能正常工作吗?

我已经实现了这两个,我只是想得到关于它的替代观点。

java function java-8
2个回答
0
投票

BiPredicate<T,U>
BiFunction<T,U,Boolean>
之间的主要区别在于它更“专业”并且具有更明确的含义,即预期将其用作谓词。

所谓“专业化”,我的意思是您可以获得开箱即用的组合

Predicate
的方法(如
and
negate
or
),而这些是
Function
所无法获得的。


0
投票

BiPredicate<T, U>
是一个带有签名
boolean test(T t, U u)
的功能接口(SAM 类型)。当方法接受 SAM 类型的参数时,您可以传递类的显式实现、lambda 表达式或方法引用。

如果您不需要传递函数并从其他地方调用它,请保留普通的旧函数。但如果您需要另一种方法来接收谓词,则需要将其编码为类型。

让我们快速看一些示例:

class MyClass {
  public static boolean stringEquals(String s1, String s2) {
    return s1.equals(s2);
  }
}

BiPredicate<String, String> lambda = (a, b) -> MyClass.stringEquals(a, b);
BiPredicate<String, String> ref = MyClass::stringEquals;
BiPredicate<String, String> anonymous = new BiPredicate<>() {
  @Override boolean test(String x, String y) {
    return MyClass.stringEquals(x, y);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.