Java - 如何创建谓词作为 Arrays.asList() 参数?

Java - How do I create Predicates as Arrays.asList() arguments?

我有几个谓词要放入列表中,这样我就可以在我的列表中调用 stream().noneMatch()。我通过创建命名谓词成功地做到了这一点,但是如何在 Arrays.asList() 的参数列表中创建它们?

这是我要转换的工作代码:

ArrayList<Predicate<MyClass>> checks = new ArrayList<>();
Predicate<MyClass> isCond1 = myClassHelper::isCond1;
Predicate<MyClass> isCond2 = myClassHelper::isCond2;
checks.add(isCond1);
checks.add(isCond2);

我希望转换的结果看起来像这样:

List<Predicate> checks = Arrays.asList(myClassHelper::isCond1, myClassHelper::isCond2);

List<Predicate> checks = Arrays.asList(a -> myClassHelper::isCond1, a -> myClassHelper::isCond2);

(这两个都不正确)
我在哪里可以为这里的条件指定参数?

抱歉,如果这个标题可以更好,我总是为此苦苦挣扎。

第一个语句应该有效,但您忘记指定谓词类型 Predicate<MyClass>,否则编译器无法从方法引用中推断它:

List<Predicate<MyClass>> checks2 = Arrays.asList(myClassHelper::isCond1, myClassHelper::isCond2);

或使用 lambda:

List<Predicate<MyClass>> checks3 = Arrays.asList(a -> myClassHelper.isCond1(a), a -> myClassHelper.isCond2(a));

如果要将多个Predicate转换为

列表

List.of since JKD 9 is a better API(e.g the return list is immutable, rejecting null), check 了解详情。

Stream.of 如果你真的想使用 Stream API.

会更好

谓词

如果有多个 MyClass 要测试,将 Predicate 组合为一个可以提供更大的灵活性,并且看起来更自然。

import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class MultiplePredicate {
    public static void main(String[] args) {
        List<MyClass> items = new ArrayList<>();
        items.add(new MyClass(1));
        items.add(new MyClass(2));
        items.add(new MyClass(3));
        //                                          drawback as compiler not smart enough
        Predicate<MyClass> allCondNotMatch = Stream.<Predicate<MyClass>>of(MyClassHelper::isCond1, MyClassHelper::isCond2)
                .map(Predicate::not)
                .reduce((myClass) -> true, Predicate::and);
        List<MyClass> itemsWithAllCondNotMatch = items.stream().filter(allCondNotMatch).toList();
        System.out.println(itemsWithAllCondNotMatch);
    }

    public static class MyClassHelper {
        public static boolean isCond1(MyClass myClass) {
            return myClass.value == 1;
        }

        public static boolean isCond2(MyClass myClass) {
            return myClass.value == 2;
        }
    }

    public static class MyClass {
        private final int value;

        public MyClass(int value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "MyClass{" +
                    "value=" + value +
                    '}';
        }
    }
}