【问题标题】:Predicate in Java11 filters all elementsJava11中的谓词过滤所有元素
【发布时间】:2019-01-06 06:52:44
【问题描述】:

我打算使用 Java11。学习一个新方法Predicate.not,我发现我目前的代码只能找到猫族为:

List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
Set<String> filterCat = animals.stream().filter(cats).collect(Collectors.toSet());
System.out.println(filterCat);

输出是:

豹、猫、狮子

现在我正在尝试使用新方法,但输出不正确。我该如何纠正?我做错了什么?

我后来的代码:

Predicate<String> updatedCatFilter = Predicate.not(a -> a.equals("dog") && a.equals("horse"));
Set<String> catFamily = animals.stream().filter(updatedCatFilter).collect(Collectors.toSet());
System.out.println(filterCat);

但这会输出我所有的列表。

马、豹、猫、狗、狮子

【问题讨论】:

    标签: java predicate java-11 functional-interface


    【解决方案1】:

    我做错了什么?

    您似乎缺少基本的De-morgan's laws 声明

    !(a || b) == !a && !b
    

    和

    !(a && b) == !a || !b
    

    我该如何纠正?

    所以您应该更改您的代码以使用

    Predicate.not(a -> a.equals("dog") || a.equals("horse")); // !(a || b)
    

    应该等同于你现有的代码

    Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
    

    也可以看作:

    Predicate<String> notDog = a -> !a.equals("dog");
    Predicate<String> notHorse =  a -> !a.equals("horse");
    Predicate<String> cats = notDog.and(notHorse); // !a && !b
    

    【讨论】:

      【解决方案2】:

      你可以这样写:

      List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
      Set<String> filterCat = animals.stream()
          .filter(Predicate.not("dog"::equals).and(Predicate.not("horse"::equals)))
          .collect(Collectors.toSet());
      System.out.println(filterCat);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多