希望您今天过得愉快!
我很难理解何时应该使用 BiPredicate 而不是 function。
例如,假设我想创建一个简单的字符串验证,如 s1.equals(s2)。当然,我可以创建一个接收两个参数的函数,检查 s1 是否不为空并继续。或者,在我的实用程序类中,创建一个静态最终 BiPredicate
我已经实现了这两个,我只是想得到关于它的替代观点。
BiPredicate<T,U>
和BiFunction<T,U,Boolean>
之间的主要区别在于它更“专业”并且具有更明确的含义,即预期将其用作谓词。
所谓“专业化”,我的意思是您可以获得开箱即用的组合
Predicate
的方法(如 and
、negate
或 or
),而这些是 Function
所无法获得的。
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);
}
}