Java谓词– Java 8谓词
时间:2020-02-23 14:36:45 来源:igfitidea点击:
在本文中,我们将讨论Java谓词,它是一种功能接口。
功能接口是仅包含一种抽象方法的接口。
Java谓词
还记得学校数学课上的谓词吗?是的,类似于一个函数,该函数接受一个值并返回true或者false。
在Java 8中,引入了java.util.function.Predicate,其行为方式相同,可以用作lambda表达式和函数接口中的赋值目标。
谓词的功能方法是test(Object)。
Java谓词示例
假设我们有一个" Apple"类:
package com.theitroad.predicates; public class Apple { private String color; private Double weight; public Apple(String c, Double w) { this.color = c; this.weight = w; } @Override public String toString() { return "Apple{color:" + this.getColor() + ",weight:" + this.getWeight() + "}"; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public Double getWeight() { return weight; } public void setWeight(Double weight) { this.weight = weight; } }
现在,如果我们有条件获取重量超过150克的苹果,则可以为它编写一个谓词,如下所示:
package com.theitroad.predicates; import java.util.function.Predicate; public class ApplePredicates { public static Predicate<Apple> isWeightAbove150() { return apple -> apple.getWeight() >= 150; } }
现在,我们可以在filter()
中使用该谓词,以根据该谓词中的条件过滤苹果列表。
让我们向ApplePredicates
类添加一个方法filterApples()
:
public static List<Apple> filterApples(List<Apple> apples, Predicate<Apple> predicate) { return apples.stream().filter(predicate).collect(Collectors.toList()); }
我们可以调用它,并在main方法中获得如下结果:
public static void main(String[] args) { List<Apple> apples = Arrays.asList(new Apple("green", 120.0), new Apple("red", 110.0), new Apple("brown", 150.0), new Apple("green", 160.0), new Apple("red", 122.0)); ApplePredicates.filterApples(apples, ApplePredicates.isWeightAbove150()).forEach(System.out::println); }
输出:
Apple{color:brown,weight:150.0} Apple{color:green,weight:160.0}
使用Java 8 lambda表达式,我们可以简单地做到如下:
ApplePredicates.filterApples(apples, apple -> { return apple.getWeight() >= 150; }).forEach(System.out::println);
或者,如果我们不想定义自己的方法,也可以使用默认的filter方法并将其编写为:
apples.stream().filter(apple -> { return apple.getWeight() >= 150; }).collect(Collectors.toList()).forEach(System.out::println);
Java 8谓词方法
现在,让我们看一下"谓词"可用的方法:
- default Predicate and(Predicate other)返回一个组成的谓词,该谓词表示两个谓词的逻辑与。
在评估组合谓词时,如果该谓词为false,则不会评估另一个谓词。
要理解这一点,让我们在ApplePredicates
类中添加另一个谓词:
现在,如果我们要使苹果成为绿色且重量大于或者等于150克的谓词,则可以应用and()
函数。
这将给出以下输出:
类似地,我们使用"或者()"方法对两个谓词进行短路,逻辑或者运算。
- " default Predicate negate()"返回代表该谓词逻辑取反的谓词。
假设我们希望该谓词获得不是绿色的苹果。
我们已经有一个判断苹果是否为绿色的谓词,因此我们可以否定它。
输出将是:
- 布尔测试(T t)评估给定参数的谓词。
在我们的例子中,我们可以传入一个Apple对象,以检查此谓词对于该苹果返回的是true还是false。
输出:
- 静态谓词isEqual(Object targetRef)返回一个谓词,该谓词根据Objects.equals()方法测试两个参数是否相等。
考虑到我们为Apple类重写了equals()方法:
现在,假设我们有一个具有标准颜色和重量的苹果。
然后我们可以得到一个谓词,它将测试给定的苹果是否为标准苹果。