带有 Or 操作/And 操作和闭包的 Java 8 谓词集合

问题描述 投票:0回答:1

我有以下片段

        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
操作来获得最终布尔值。 我想将它们添加到集合中,并希望每个谓词对各自的参数进行操作。我怎么做? 还有比拥有更好的收藏方式吗
?

java java-8 java-stream
1个回答
0
投票

为此开设课程。这种事情就是课程的目的。

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));

尝试使用不同谓词的列表将非常尴尬,并且需要大量不安全的转换。

© www.soinside.com 2019 - 2024. All rights reserved.