代码之家  ›  专栏  ›  技术社区  ›  Mani

Java11中的谓词过滤所有元素

  •  7
  • Mani  · 技术社区  · 7 年前

    我打算使用Java11。学习新方法 ,我找到了我当前的代码,只找到猫族,因为:

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

    但现在这输出了我所有的列表。

    马,豹,猫,狗,狮子

    1 回复  |  直到 7 年前
        1
  •  14
  •   Naman    7 年前

    我做错了什么?

    你好像错过了基本的 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
  •  0
  •   lczapski user12421871    6 年前

    你可以这样写:

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