在一条语句中使用 and/or/negate 方法创建谓词?
Create Predicate with and/or/negate methods in one statement?
java.util.function.Predicate
有一些有用的方法,如 and
、or
等,比使用多个逻辑运算符创建括号狂欢更简洁。不幸的是,如果不首先明确地使用谓词,似乎无法使用这些函数...
Predicate<String> predicate = String::isEmpty;
Predicate<String> predicateWithAnd = predicate.and( MyClass::testSomething );
有没有办法只在一个语句中创建第二个谓词(因此 "saving" 一个变量),比如...
Predicate<String> predicateWithAnd = (String::isEmpty).and( MyClass::testSomething ); // That doesn't seem to work ;-)
只是好奇...
是的,您需要将 lambda 转换为 Predicate 类型,其中 T 是您的类型。人物 class.
的示例
Predicate<Person> a = ((Predicate<Person>)p -> p.getId() > 2)
.and(p -> p.getPrice() > 100);
不太清楚为什么 str -> str.isEmpty() && MyClass.testSomething(str)
被称为 "bracket orgy"。它易读且简短。通常,当您准备好 Predicate
个对象时,这些 and
、or
方法很有用。您不应使用它们来组合方法引用或 lambda。
如果真的要使用方法引用,也没什么技巧。首先,您可以像这样创建自己的实用程序 class:
import java.util.function.Predicate;
import java.util.stream.Stream;
public class Predicates {
@SafeVarargs
public static <T> Predicate<T> and(Predicate<T>... preds) {
return Stream.of(preds).reduce(Predicate::and).orElse(x -> true);
}
@SafeVarargs
public static <T> Predicate<T> or(Predicate<T>... preds) {
return Stream.of(preds).reduce(Predicate::or).orElse(x -> false);
}
}
并像这样使用它:
import static mypackage.Predicates.*;
Predicate<String> predicateWithAnd = and(String::isEmpty, MyClass::testSomething);
或者你可以只创建一个非常无用的静态方法:
public static <T> Predicate<T> pred(Predicate<T> pred) {
return pred;
}
并像这样使用它:
pred(String::isEmpty).and(MyClass::testSomething);
这比显式类型转换要短得多。但是我仍然会建议继续使用像 str -> str.isEmpty() && MyClass.testSomething(str)
.
这样的显式 lambda
java.util.function.Predicate
有一些有用的方法,如 and
、or
等,比使用多个逻辑运算符创建括号狂欢更简洁。不幸的是,如果不首先明确地使用谓词,似乎无法使用这些函数...
Predicate<String> predicate = String::isEmpty;
Predicate<String> predicateWithAnd = predicate.and( MyClass::testSomething );
有没有办法只在一个语句中创建第二个谓词(因此 "saving" 一个变量),比如...
Predicate<String> predicateWithAnd = (String::isEmpty).and( MyClass::testSomething ); // That doesn't seem to work ;-)
只是好奇...
是的,您需要将 lambda 转换为 Predicate 类型,其中 T 是您的类型。人物 class.
的示例Predicate<Person> a = ((Predicate<Person>)p -> p.getId() > 2)
.and(p -> p.getPrice() > 100);
不太清楚为什么 str -> str.isEmpty() && MyClass.testSomething(str)
被称为 "bracket orgy"。它易读且简短。通常,当您准备好 Predicate
个对象时,这些 and
、or
方法很有用。您不应使用它们来组合方法引用或 lambda。
如果真的要使用方法引用,也没什么技巧。首先,您可以像这样创建自己的实用程序 class:
import java.util.function.Predicate;
import java.util.stream.Stream;
public class Predicates {
@SafeVarargs
public static <T> Predicate<T> and(Predicate<T>... preds) {
return Stream.of(preds).reduce(Predicate::and).orElse(x -> true);
}
@SafeVarargs
public static <T> Predicate<T> or(Predicate<T>... preds) {
return Stream.of(preds).reduce(Predicate::or).orElse(x -> false);
}
}
并像这样使用它:
import static mypackage.Predicates.*;
Predicate<String> predicateWithAnd = and(String::isEmpty, MyClass::testSomething);
或者你可以只创建一个非常无用的静态方法:
public static <T> Predicate<T> pred(Predicate<T> pred) {
return pred;
}
并像这样使用它:
pred(String::isEmpty).and(MyClass::testSomething);
这比显式类型转换要短得多。但是我仍然会建议继续使用像 str -> str.isEmpty() && MyClass.testSomething(str)
.