1、Predicate简介
源码
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Predicate<T> {
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);
}
}
案例:
import org.junit.Test;
import java.util.function.Predicate;
/**
* 断言类型Predicate测试
*/
public class PredicateTest {
@Test
public void test(){
// 原写法
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String s) {
return "predicate".equals(s);
}
};
System.out.println(predicate.test("predicate"));
System.out.println(predicate.test("predicate_1"));
// Lambda写法
Predicate<String> predicate1 = s -> "predicate".equals(s);
System.out.println(predicate1.test("predicate"));
System.out.println(predicate1.test("predicate_1"));
/**
* true
* false
* true
* false
*/
}
}
2、Predicate写法案例
package com.xian.thread.lambda;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
/**
* Predicate案例
*/
public class PredicateCaseTest {
/**
* 案例测试
*/
@Test
public void caseTest() {
// 1、字符串的长度是否大于4
boolean strLength = judgeByPredicate("lisi", s -> s.length() > 4);
System.out.println(strLength);
boolean strLength_1 = judgeByPredicate("zhangsan", s -> s.length() > 4);
System.out.println(strLength_1);
// 数字是否大于4
boolean num = judgeByPredicate(2, n -> n > 4);
System.out.println(num);
boolean num_1 = judgeByPredicate(5, n -> n > 4);
System.out.println(num_1);
// Map是否含有
Map<String,Object> map = new HashMap<>();
map.put("Tom",2);
map.put("Kitty",3);
map.put("Jerry",5);
boolean isTom = judgeByPredicate("Tom", t -> map.containsKey(t));
System.out.println(isTom);
boolean isJerry = judgeByPredicate("Jerry", t -> map.containsKey(t));
System.out.println(isJerry);
}
public <T> boolean judgeByPredicate(T t, Predicate<T> predicate) {
return predicate.test(t);
}
}
3、and,or,negate(取反),isEqual
package com.xian.thread.lambda;
import org.junit.Test;
import java.util.function.Predicate;
/**
* Predicate接口的默认方法和静态方法测试
*/
public class PredicateOtherMethodTest {
@Test
public void test() {
// and
boolean andResult = judgeByPredicateAnd("predicate", t -> t.length() > 6, t -> t.length() < 10);
boolean andResult1 = judgeByPredicateAnd("predicate", t -> t.length() > 10, t -> t.length() < 20);
System.out.println("and 的结果:" + andResult);
System.out.println("and 的结果:" + andResult1);
/**
* and 的结果:true
* and 的结果:false
*/
boolean orResult = judgeByPredicateOr("predicate", t -> t.length() > 1, t -> t.length() < 5);
boolean orResult1 = judgeByPredicateOr("predicate", t -> t.length() > 5, t -> t.length() < 20);
System.out.println("or 的结果:" + orResult);
System.out.println("or 的结果:" + orResult1);
/**
* or 的结果:true
* or 的结果:true
*/
boolean negateResult = judgeByPredicateNegate(2, t -> t > 1);
System.out.println("negate 的结果:" + negateResult);
/**
* negate 的结果:false
*/
boolean equalResult = judgeByPredicateEqual("Tom", "Tom");
boolean equalResult1 = judgeByPredicateEqual("Tom", "Jerry");
System.out.println("equal 的结果:" + equalResult);
System.out.println("equal 的结果:" + equalResult1);
/**
* equal 的结果:true
* equal 的结果:false
*/
}
/**
* 是否相等(isEqual)
*
* @param t1
* @param t2
* @param <T>
* @return
*/
public <T> boolean judgeByPredicateEqual(T t1, T t2) {
return Predicate.isEqual(t1).test(t2);
}
/**
* 与(and)
*
* @param t
* @param predicate1
* @param predicate2
* @param <T>
* @return
*/
public <T> boolean judgeByPredicateAnd(T t, Predicate<T> predicate1, Predicate<T> predicate2) {
return predicate1.and(predicate2).test(t);
}
/**
* 或(or)
*
* @param t
* @param predicate1
* @param predicate2
* @param <T>
* @return
*/
public <T> boolean judgeByPredicateOr(T t, Predicate<T> predicate1, Predicate<T> predicate2) {
return predicate1.or(predicate2).test(t);
}
/**
* 取反(negate)
*
* @param t
* @param predicate
* @param <T>
* @return
*/
public <T> boolean judgeByPredicateNegate(T t, Predicate<T> predicate) {
return predicate.negate().test(t);
}
}