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 +
'}';
}
}
}
我有几个谓词要放入列表中,这样我就可以在我的列表中调用 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 +
'}';
}
}
}