Predicate函数接口Java示例
在这篇文章中,我们将看到java.util.function.Predicate函数接口的示例。
Predicate接口中的方法
Predicate函数接口表示一个布尔值函数,返回true或者false。该功能接口中的抽象方法是
boolean test(T t)此方法对传递的参数评估Predicate,并根据输入参数是否与Predicate匹配来返回true或者false。
如果编写的Lambda表达式采用单个参数,并使用该参数评估返回true或者false的条件,则可以将该lambda表达式编写为Predicate内置功能接口的实现。
除了test()抽象方法之外,Predicate接口还具有以下默认方法和静态方法。
and(Predicate <?super T> other)这是默认的接口方法,该方法返回表示该Predicate与另一个Predicate的短路逻辑AND的组合Predicate。首先,如果调用的Predicate为假,则对其进行评估,然后甚至不评估作为参数传递的Predicate。
or(Predicate <?super T> other)这是默认方法,该方法返回表示此Predicate与另一个Predicate的短路逻辑OR的组合Predicate。首先在组合Predicate中评估调用Predicate(如果为真),然后甚至不评估作为参数传递的Predicate。
negate()这是一个默认方法,它返回表示该Predicate逻辑否定的Predicate。
isEqual(Object targetRef)这是一个静态接口方法,返回一个Predicate,该Predicate根据Objects.equals(Object,Object)测试两个参数是否相等。
Predicate接口test()方法示例
1.一个简单的实现,用于检查传递的参数是否大于10.
import java.util.function.Predicate; public class PredicateExample { public static void main(String[] args) { Predicate<Integer> predicate = (i) -> i > 10; boolean val = predicate.test(8); System.out.println("val- " + val); val = predicate.test(15); System.out.println("val- " + val); } }
输出:
val- false val- true
在示例中; statementPredicatePredicate=(i)-> i> 10;是Predicate接口作为lambda表达式的实现。
调用predicate.test()方法时,Java可以从上下文中推断出lambda表达式是test()方法的实现。
2.在此示例中,有一个方法带有两个参数。Predicate和列表。从传递的列表中,将通过Predicate的那些元素添加到另一个列表中。
import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.function.Predicate; public class PredicateExample { public static void main(String[] args) { List<Integer> myList = new ArrayList<Integer>(); myList.add(20); myList.add(60); myList.add(40); myList.add(80); Collection<Integer> values = filter(n -> n > 50, myList); System.out.println("Values in new list " + values); } public static <T> Collection<T> filter(Predicate<T> predicate, Collection<T> listItems) { Collection<T> newList = new ArrayList<T>(); for(T item: listItems) { if(predicate.test(item)) { newList.add(item); } } return newList; } }
输出:
Values in new list [60, 80]
Predicate函数接口和()方法示例
在示例中,我们将进行范围检查,以确保传递的整数大于10但小于30。这可以使用Predicate接口的and()方法来完成,方法是创建两个Predicate并使用and()组合它们,以便首先评估大于10的条件,然后评估小于30的条件。
public class PredicateExample { public static void main(String[] args) { Predicate<Integer> predicate = (i) -> i > 10; Predicate<Integer> andPredicate = predicate.and((i) -> i < 30); boolean val = andPredicate.test(20); System.out.println("val is- " + val); val = andPredicate.test(40); System.out.println("val is- " + val); val = andPredicate.test(5); System.out.println("val is- " + val); } }
输出:
val is- true val is- false val is- false
Predicate函数接口or()方法示例
如果我们想检查传递的字符串是以字母" A"还是" B"开头的情况,则可以使用Predicate接口的or()方法来实现该逻辑。
public class PredicateExample { public static void main(String[] args) { Predicate<String> predicate = (s) -> s.toUpperCase().startsWith("A"); Predicate<String> orPredicate = predicate.or((s) -> s.toUpperCase().startsWith("B")); boolean val = orPredicate.test("again"); System.out.println("val is- " + val); val = orPredicate.test("Bat"); System.out.println("val is- " + val); val = orPredicate.test("Dog"); System.out.println("val is- " + val); } }
输出:
val is- true val is- true val is- false
Predicate函数接口negate()方法示例
假设我们已经有一个Predicate,用于检查所传递的字符串是否以A开头。现在,我们需要检查条件,如果传递的字符串以A以外的其他任何字母开头,那么我们可以否定现有Predicate以获取可以检查的Predicate。
public class PredicateExample { public static void main(String[] args) { Predicate<String> predicate = (s) -> s.toUpperCase().startsWith("A"); Predicate<String> predicateNegate = predicate.negate(); boolean val = predicateNegate.test("again"); System.out.println("val is- " + val); val = predicateNegate.test("Bat"); System.out.println("val is- " + val); val = predicateNegate.test("Dog"); System.out.println("val is- " + val); } }
输出:
val is- false val is- true val is- true
JDK中的Predicate函数接口
这些内置的功能接口已在JDK本身中广泛使用。Predicate接口用法的一个很好的例子是Java Stream API中Stream接口的filter()方法。
filter(Predicate <?super T> predicate)返回包含与给定Predicate匹配的该流元素的流。
可以使用Stream的filter()方法重写过滤列表以创建新列表的示例。
public class PredicateExample { public static void main(String[] args) { List<Integer> myList = new ArrayList<Integer>(); myList.add(20); myList.add(60); myList.add(40); myList.add(80); List<Integer> newList = myList.stream().filter((i) -> i > 50).collect(Collectors.toList()); newList.forEach(System.out::println); } }
输出:
60 80