Predicate函数接口Java示例

时间:2020-01-09 10:35:14  来源:igfitidea点击:

在这篇文章中,我们将看到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