我很难理解什么时候应该用BiPredicate而不是function.

例如,假设我想创建一个简单的String验证,如s1.equals(s2).当然,我可以创建一个接收两个参数的函数,判断s1是否为null并继续运行.或者,在我的utilities类中,创建一个静态的final BiPredicate String,String,在那里比较它们,然后在需要的地方导入到我的main class use中.<>但是如果我在utils中创建一个函数,而不是BiPredicate,并将其公开,它不是也能正常工作吗?

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

推荐答案

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#equalsObjects#equalsString#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);

Java相关问答推荐

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

Jooq外键关系

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

扩展到弹出窗口宽度的JavaFX文本字段

只需最少的代码更改即可将版本号标记添加到日志(log)

如何确定springboot在将json字段转换为Dto时如何处理它?

在springboot 3中,当我调用api endpoint时,会出现404

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

如何使用值中包含与号的查询参数创建一个java.net.URI

如何在Microronaut中将 map 读取为 map

Sack()步骤中的合并运算符未按预期工作

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

如何在Cosmos DB(Java SDK)中增加默认响应大小

Java泛型类方法的静态返回类型是否被类型擦除?

无法将GSON导入到我的JavaFX Maven项目

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

Java嵌套流查找任意值

谷歌应用引擎本地服务器赢得';t在eclipse上运行

";home/runner/work/中没有文件...匹配到[**/pom.xml];Maven项目的构建过程中出现错误

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换