一、java.util.function.Predicate
這里類是java自帶主要廣泛用在支持lambda表達式的API中。
1、接口源碼
@FunctionalInterface
public interface Predicate<T> {
/**
* 具體過濾操作 需要被子類實現.
* 用來處理參數T是否滿足要求,可以理解為 條件A
*/
boolean test(T t);
/**
* 調用當前Predicate的test方法之后再去調用other的test方法,相當於進行兩次判斷
* 可理解為 條件A && 條件B
*/
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
/**
* 對當前判斷進行"!"操作,即取非操作,可理解為 ! 條件A
*/
default Predicate<T> negate() {
return (t) -> !test(t);
}
/**
* 對當前判斷進行"||"操作,即取或操作,可以理解為 條件A ||條件B
*/
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
/**
* 對當前操作進行"="操作,即取等操作,可以理解為 A == B
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
2、常規示例
public static void main(String[] args) {
/**
* 1、判斷數字是否大於7
*/
//設置一個大於7的過濾條件
Predicate<Integer> predicate = x -> x > 7;
System.out.println(predicate.test(10)); //輸出 true
System.out.println(predicate.test(6)); //輸出 fasle
/**
* 2、大於7並且
*/
//在上面大於7的條件下,添加是偶數的條件
predicate = predicate.and(x -> x % 2 == 0);
System.out.println(predicate.test(6)); //輸出 fasle
System.out.println(predicate.test(12)); //輸出 true
System.out.println(predicate.test(13)); //輸出 fasle
/**
* 3、add or 簡化寫法
*/
predicate = x -> x > 5 && x < 9;
System.out.println(predicate.test(10)); //輸出 false
System.out.println(predicate.test(6)); //輸出 true
}
3、集合Stream示例
User對象
@Data
@AllArgsConstructor
@ToString
public class User {
/**
* 姓名
*/
private String name;
/**
* 性別
*/
private String sex;
/**
* 年齡
*/
private Integer age;
/**
* 重寫equals和hashCode
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof User) {
User user = (User) obj;
if (name.equals(user.name)){
return true;
}
}
return false;
}
@Override
public int hashCode () {
return name.hashCode();
}
}
測試代碼
public static void main(String[] args) {
User user1 = new User("張三", "女", 1);
User user2 = new User("李四", "男", 2);
User user3 = new User("張三", "女", 3);
List<User> list = Lists.newArrayList(user1, user2, user3);
/**
* 1、獲取年齡大於2的對象
*/
List<User> collect = list.stream().filter(x -> x.getAge() > 2).collect(Collectors.toList());
System.out.println("獲取年齡大於2的數量 = " + collect.size());
//輸出:獲取年齡大於2的數量 = 1
/**
* 2、去重 設置name相同即為相同對象
*/
//方式1直接使用 distinct
List<User> collect1 = list.stream().distinct().collect(Collectors.toList());
System.out.println("輸出剩余對象" + collect1);
//輸出:輸出剩余對象[User(name=張三, sex=女, age=1), User(name=李四, sex=男, age=2)]
/**
* 3、從集合找出與該對象相同的元素 同樣name相同即為相同對象
*/
User user4 = new User("張三", "男", 8);
Predicate<User> predicate = Predicate.isEqual(user4);
List<User> collect2 = list.stream().filter(predicate).collect(Collectors.toList());
System.out.println("與該對象相同的對象有" + collect2);
//輸出:與該對象相同的對象有[User(name=張三, sex=女, age=1), User(name=張三, sex=女, age=3)]
}
運行結果