当前位置: 首页 > 知识库问答 >
问题:

Java—如何将谓词创建为数组。asList()参数?

东方明亮
2023-03-14

我有几个谓词要放在一个列表中,这样我就可以调用stream()。我的列表中没有匹配()。我通过创建命名谓词成功地做到了这一点,但如何在数组中创建它们呢。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);

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

很抱歉,如果这本可以被命名为更好的,我总是与之斗争。

共有2个答案

夏英发
2023-03-14

如果要将多个谓词转换为

List.of由于JKD 9是更好的API(例如返回列表不可变,拒绝null),请检查List.of和Arrays.as列表有什么区别?了解详细信息。

<代码>流。如果您真的想使用流API,那么of(代码)甚至更好。

如果有多个MyClass要测试,那么将谓词与一个进行组合会给您带来更大的灵活性,并且看起来更自然。

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 +
                    '}';
        }
    }
}

车明贤
2023-03-14

第一条语句应该可以工作,但您忘记指定谓词类型

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));
 类似资料:
  • 问题内容: 我有以下代码: 将其转换为使用Java 8 的正确方法是什么? 当我尝试使用时,我遇到错误,因为不是。 问题答案: 您无法完全执行所需的操作-方法引用中不允许使用显式参数。 但是你可以… …创建一个方法,该方法返回一个布尔值并将其调用编码为: 这将允许您使用方法ref: …或者您可以定义一个变量来保存该函数: 这将允许您简单地传递变量 …或者您可以咖喱和结合上述两种方法(这绝对是过分的

  • 问题内容: 有没有一种方法可以创建对象数组作为构造函数或方法的一部分?我真的不知道该如何措辞,因此我提供了一个示例。我有一个枚举,并且其中一个字段是数字数组。这是我尝试过的: 编译器说方括号{}无效,应将其删除。有没有一种方法可以将数组作为参数传递而无需事先创建对象数组? 问题答案: 您可以尝试使用。

  • 基础回购 和存储库类 现在我想使用带有谓词查询的Repo。我需要形成一个谓词,在这个谓词中,我可以根据给定的Bs加载

  • 问题内容: 使用Java 8,我得到以下代码的编译器错误: 因此,基本上,编译器会说“我知道您会返回,但您不应该返回,如果不知道,我不确定使用哪种方法”,而不是“哦,您将返回,您必须指代该方法的版本” ?如何产生这种混乱? 我知道(如果它们有一个通用的Type),但事实并非如此。 我确实知道如何解决它;如果我这样做很好 但我很好奇是什么原因造成的。 问题答案: 为了清楚起见,可以对此进行一些简化:

  • 问题内容: 我不理解泛型和数组之间的联系。 我可以使用通用类型创建数组引用: 但是不能创建具有通用类型的数组对象: 但它有效: 问题答案: 你不应该混淆数组和泛型。他们在一起不好。数组和泛型类型执行类型检查的方式有所不同。我们说数组是经过整形的,而泛型则不是。结果,你会看到这些差异适用于数组和泛型。 数组是协变的,泛型不是: 那意味着什么?你现在必须已经知道以下分配有效: 基本上,Object[]

  • 我试图获取一个已排序的<代码>文件[] 数组(对其应用了特定的排序条件),并尝试对具有与第一次排序相似的排序结果的不同对象应用额外的排序(例如,文件大小)。 我编写了以下代码,但不起作用: 基本上,所有我试图做的,是检查哪些文件从共享相同的从给定的BiPredicate,并排序这些文件与排序按,所以结果应该是一个排序数组,用给定的BiPredicate进行初始排序(假设已经排序)-然后使用deaf