首页 > 解决方案 > Java 8 lambda 链接谓词不起作用

问题描述

我有一份水果清单:

final List<Fruit> fruitList = Arrays.asList(new Fruit(1, "AA"), new Fruit(2, "DD"),
            new Fruit(3, "CC"), new Fruit(4, "BB"));

和水果的谓词

final Predicate<Fruit> predicate = s -> s.getName().equals("AA") && s.getId() == 10;

谓词的输出

System.out.println(fruitList.stream().anyMatch(predicate)); -> output false

当我将谓词与另一个谓词链接时,它将不起作用

final Predicate<Fruit> predicate = s -> s.getName().equals("AA");
predicate.and(s -> s.getId() == 10);
System.out.println(fruitList.stream().anyMatch(predicate)); -> output true

怎么可能?

标签: javajava-8predicate

解决方案


来自 Predicate 的文档

and(谓词<?super T>其他)

返回一个组合谓词,该谓词表示此谓词与另一个谓词的短路逻辑与。

结果谓词被返回并且不被引用修改,因此您需要分配它,正如@Zircon 在注释 ( predicate = predicate.and(...)) 中所述。


推荐阅读