Java 8 Predicate示例

时间:2020-02-23 14:34:53  来源:igfitidea点击:

Java 8 Predicate是Java 8中引入的功能接口。

Predicate定义

Predicate单个参数功能接口是否返回true或者false。

它需要一个参数并返回结果为true或者false。

//Using anonymous class
		Predicate<Integer> predicate=new Predicate<Integer>() {
 
			@Override
			public boolean test(Integer i) {
				return i > 100;
			}
		};
		
		//Using lambda expression
		Predicate<Integer> predicate = i -> i > 100;

这是定义 Predicate接口。

package java.util.function;
 
import java.util.Objects;
 
/**
 * Represents a predicate (boolean-valued function) of one argument.
 *
 * <p>This is a <a href="package-summary.html">functional interface</a>
 * whose functional method is {@link #test(Object)}.
 *
 * @param <T> the type of the input to the predicate
 *
 * @since 1.8
 */
@FunctionalInterface
public interface Predicate<T> {
 
    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
 
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
 
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
 
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
 
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

Predicate方法示例

test()

这是 Predicate接口的抽象方法。

如果 Predicate与输入参数匹配,则会评估True。

这是一个简单的例子 test()检查输入参数是否大于100或者不检查的方法。

package org.igi.theitroad;
 
import java.util.function.Predicate;
 
public class Java8PredicateExample {
 
	public static void main(String[] args) {
		Predicate<Integer> predicate = i -> i > 100;
		boolean greaterCheck = predicate.test(200);
		System.out.println("is 200 greater than 100: "+greaterCheck);
	}
}

我们也可以将 Predicate作为函数参数传递。

package org.igi.theitroad;
 
import java.util.function.Predicate;
 
public class Java8PredicateMethodExample {
 
	public static void main(String[] args) {
		boolean greaterCheckBoolean = greaterCheck(200, p -> p > 100);
		System.out.println(greaterCheckBoolean);
	}
 
	public static boolean greaterCheck(int number, Predicate<Integer> predicate) {
		return predicate.test(number);
	}
}

and()

and()是返回表示逻辑的复合 Predicate的默认方法,并通过 Predicate和传递的 Predicate。

package org.igi.theitroad;
 
import java.util.function.Predicate;
 
public class Java8PredicateAndExample {
	
	public static void main(String[] args) {
		Predicate<Integer> predicate1 = i -> i > 100;
		Predicate<Integer> predicate2 = i -> i < 300;
		
		Predicate<Integer> andPredicate = predicate1.and(predicate2);
		boolean rangeCheck = andPredicate.test(200);
		System.out.println("200 lies between 100 and 300: "+ rangeCheck);
	}
}

我们已经创建了两个 Predicate并检查了逻辑和 Predicate1和 Predicate2

or()

or()是返回表示逻辑或者此 Predicate和传递 Predicate的复合 Predicate的默认方法。

package org.igi.theitroad;
 
import java.util.function.Predicate;
 
public class Java8PredicateAndExample {
	
	public static void main(String[] args) {
		Predicate<Integer> predicate1 = i -> i > 100;
		Predicate<Integer> predicate2 = i -> i < 50;
		
		Predicate<Integer> andPredicate = predicate1.or(predicate2);
		boolean rangeCheck = andPredicate.test(30);
		System.out.println("(30 > 100) or (30 < 50) returns: "+ rangeCheck);
	}
}

我们已经创建了两个 Predicate并检查了逻辑或者 Predicate1和 Predicate2

negate()

negate()是返回 Predicate的默认方法,其表示逻辑否定此 Predicate。

package org.igi.theitroad;
 
import java.util.function.Predicate;
 
public class Java8PredicateAndExample {
	
	public static void main(String[] args) {
		Predicate<Integer> predicate = i -> i > 100;
		
		Predicate<Integer> NegatePredicate = predicate.negate();
		
		//Negate predicate will become i -> i < 100
		boolean rangeCheck = NegatePredicate.test(30);
		System.out.println("30 is less than 100: "+ rangeCheck);
	}
}

isEqual()

isEqual()是静态方法返回 Predicate,该 Predicate是否基于对象的equals()方法等于两个参数。

package org.igi.theitroad;
 
import java.util.function.Predicate;
 
public class Java8PredicateAndExample {
	
	public static void main(String[] args) {
		
		Predicate<String> predicate = Predicate.isEqual("test1");
		
		System.out.println(predicate.test("test1"));
		System.out.println(predicate.test("test2"));
	}
}

使用 Predicate过滤列表

Java 8流 filter方法需要 Predicate作为一个参数,可以用来在 Predicate的帮助下过滤列表。
让我们说你有以下学生程序:

package org.igi.theitroad;
 
public class Student {
 
	private int id;
	private String name;
	private String gender;
	private int age;
 
	public Student(int id, String name, String gender, int age) {
		super();
		this.id = id;
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
 
	public int getId() {
		return id;
	}
 
	public void setId(int id) {
		this.id = id;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public String getGender() {
		return gender;
	}
 
	public void setGender(String gender) {
		this.gender = gender;
	}
 
	public int getAge() {
		return age;
	}
 
	public void setAge(int age) {
		this.age = age;
	}
 
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
	}
}

允许创建一个函数,该函数将用于过滤基于 Predicate的学生。

public static List filterStudents (List students,Predicate predicate) {
     return students.stream().filter( predicate ).collect(Collectors.toList());
    }

让我们创建一个主要类:

package org.igi.theitroad;
 
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
 
public class Java8PredicateStudentExample {
 
	public static void main(String[] args) {
		List<Student> studentList = createStudentList();
 
		//Filter all male student who have age > 18
		Predicate<Student> predicate1 = s -> s.getGender().equalsIgnoreCase("M") && s.getAge() > 18;
		List<Student> students1 = filterStudents(studentList, predicate1);
		System.out.println("Male students having age > 18 are :" + students1);
 
		//Filer all female student who have age < 18
		Predicate<Student> predicate2 = s -> s.getGender().equalsIgnoreCase("F") && s.getAge() < 18;
		List<Student> students2 = filterStudents(studentList, predicate2);
		System.out.println("Female students having age < 18 are :" + students2);
	}
 
	public static List<Student> filterStudents(List<Student> students, Predicate<Student> predicate) {
		return students.stream().filter(predicate).collect(Collectors.toList());
	}
 
	public static List<Student> createStudentList() {
		List<Student> studentList = new ArrayList<>();
		Student s1 = new Student(1, "igi", "M", 19);
		Student s2 = new Student(2, "John", "M", 17);
		Student s3 = new Student(3, "Mary", "F", 14);
		Student s4 = new Student(4, "Martin", "M", 21);
		Student s5 = new Student(5, "Monica", "F", 16);
		Student s6 = new Student(6, "Ally", "F", 20);
 
		studentList.add(s1);
		studentList.add(s2);
		studentList.add(s3);
		studentList.add(s4);
		studentList.add(s5);
		studentList.add(s6);
		return studentList;
	}
}