BiPredicate<T, U>
是具有签名boolean test(T t, U u)
的功能接口(SAM类型).当一个方法接受SAM类型的参数时,可以传递该类的显式实现、lambda表达式或方法ref.
如果您不需要传递函数并从其他地方调用它,请使用普通的旧函数.但是,如果需要另一个方法来接收谓词,则需要将其编码为类型.
让我们快速看一些例子:
class MyClass {
public static boolean stringEquals(final String s1, final String s2) {
return s1.equals(s2);
}
}
final BiPredicate<String, String> lambda = (a, b) -> MyClass.stringEquals(a, b);
final BiPredicate<String, String> lambda2 = (a, b) -> a.equals(b);
final BiPredicate<String, String> ref = MyClass::stringEquals;
final BiPredicate<String, String> ref2 = String::equals;
final BiPredicate<String, String> anonymous = new BiPredicate<>() {
@Override boolean test(final String x, final String y) {
return MyClass.stringEquals(x, y);
}
};
final BiPredicate<String, String> anonymous2 = new BiPredicate<>() {
@Override boolean test(final String x, final String y) {
return x.equals(y);
}
};
final boolean same = lambda.test("yes", "yes");
final boolean same2 = lambda2.test("no", "no");
final boolean different = ref.test("yes", "no");
final boolean different2 = ref2.test("yes", "no");
final boolean equal = anonymous.test("maybe", "maybe");
final boolean equal2 = anonymous2.test("maybe", "maybe");
假设您正在编写一个需要比较字符串的组件,但是您希望组件的用户决定应该如何比较字符串(String#equals
,Objects#equals
,String#equalsIgnoreCase
).您可以如下定义方法:
class MyComponent {
public boolean compare(final String s1, final String s2, final BiPredicate<String, String> pred) {
return pred.test(s1, s2);
}
}
final boolean truthy = component.compare("yes", "YES", String::equalsIgnoreCase);
final boolean falsy = component.compare("yes", "YES", String::equals);
// or something completely different:
final boolean result = component.compare("yes", "maybe", (a, b) -> a.length()*2 == b.length()+1);