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()方法:
    现在,假设我们有一个具有标准颜色和重量的苹果。
    然后我们可以得到一个谓词,它将测试给定的苹果是否为标准苹果。