我有以下片段
String s1=null;
Double d1=null;
Integer i1=null;
Predicate<String> p1 = (e->e.equals("correct string"));
Predicate<Integer> p2 = (i->i%2 == 0);
Predicate<Double> p3 = (d->d.isNaN());
List<Predicate<?>> l = List.of(p1,p2,p3);
目标:我想将
s1
传递给 p1
,将 d1
传递给 p2
,将 i1
传递给 p3,并且可能需要通过对所有谓词执行 and
操作或 or
操作来获得最终布尔值。
我想将它们添加到集合中,并希望每个谓词对各自的参数进行操作。我怎么做?
还有比拥有更好的收藏方式吗?
为此开设课程。这种事情就是课程的目的。
public record Data(String s,
double d,
int i) {
// Deliberately empty
}
public record DataChecker(Predicate<? super String> stringTest,
DoublePrediate doubleTest,
IntPredicate intTest)
implements Predicate<Data> {
@Override
public boolean test(Data data) {
return stringTest().test(data.s())
&& doubleTest().test(data.d())
&& intTest().test(data.i());
}
public boolean anyValueMatches(Data data) {
return stringTest().test(data.s())
|| doubleTest().test(data.d())
|| intTest().test(data.i());
}
}
用途:
Data data = new Data("example", 1.5, 4);
DataChecker checker = new DataChecker(
e -> e.equals("correct string"),
i -> i % 2 == 0,
Double::isNaN);
System.out.println(checker.test(data));
System.out.println(checker.anyValueMatches(data));
尝试使用不同谓词的列表将非常尴尬,并且需要大量不安全的转换。