JAVA8函数式编程四接口:
断言式:java.util.function.Predicate
消费型:java.util.function.Consumer
供给型:java.util.function.Supplier
函数式:java.util.function.Function
Java 8中的Predicate是一个函数式接口,它描述了一个可以接受一个输入参数并返回一个布尔值结果的函数。它提供了一种可以在各种环境中进行筛选的方法,例如集合过滤、流操作和字符串处理等。
Predicate接口中有一个抽象方法:
boolean test(T t);
它接受一个泛型参数T,表示函数输入的类型,返回一个布尔结果。
除了抽象方法test()之外,Predicate还提供了许多默认方法。其中,最常用的是and()、or()和negate()方法:
- and()方法:将两个Predicate组合成一个Predicate,并返回一个新的Predicate对象,它表示两个Predicate同时成立的条件。
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
- or()方法:将两个Predicate组合成一个Predicate,并返回一个新的Predicate对象,它表示两个Predicate中的至少一个条件成立。
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
- negate()方法:将当前Predicate取反,并返回一个新的Predicate对象。
default Predicate<T> negate() {
return (t) -> !test(t);
}
除此之外,Predicate还提供了许多其他方法,例如isEqual()、isNull()和notNull()等。可以根据需要选择使用。
小李子:
package predicate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.IntPredicate;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateTest {
public static void main(String[] args) {
// 基本类型是通过 Arrays.stream() 获取流。集合类型通过 list.stream()获取流。
// int 数组
int[] intArr = new int[]{1,2,3,4,5,6,7,8,9};
// 求数组的最大值
System.out.println("数组最大值:"+Arrays.stream(intArr).max().getAsInt());
// 求数组的最小值
System.out.println("数组最小值:"+Arrays.stream(intArr).min().getAsInt());
// 求数组的和
System.out.println("数组和:"+Arrays.stream(intArr).sum());
// 求数组的总数
System.out.println("数组总数:"+Arrays.stream(intArr).count());
// 求数组的平均值
System.out.println("数组平均值:"+Arrays.stream(intArr).average().getAsDouble());
// 基本类型用IntPredicate
IntPredicate intPredicate = x -> x< 5;
int[] filterArr = Arrays.stream(intArr).filter(intPredicate).toArray();
System.out.println("数组小于5的:"+Arrays.toString(filterArr));
boolean anyMatch = Arrays.stream(intArr).anyMatch(intPredicate);
System.out.println(anyMatch ? "存在小于5的":"不存在小于5的");
// list
List<Integer> intList = Arrays.asList(1,2,3,4,5,6,7,8);
System.out.println("列表最大值:"+intList.stream().max(Integer::compareTo).get());
System.out.println("列表最小值:"+intList.stream().min(Integer::compareTo).get());
System.out.println("列表总数:"+intList.stream().count());
Predicate<Integer> integerPredicate = x -> x<4;
List<Integer> filterList = intList.stream().filter(integerPredicate).collect(Collectors.toList());
System.out.println("列表中小于4的值:"+filterList);
// integerPredicate.negate() 取反
List<Integer> filterList2 = intList.stream().filter(integerPredicate.negate()).collect(Collectors.toList());
System.out.println("列表中大于等于4的值:"+filterList2);
Predicate<Integer> integerPredicate1 = x -> x>2;
// and or
List<Integer> filterList3 = intList.stream().filter(integerPredicate.and(integerPredicate1)).collect(Collectors.toList());
System.out.println("列表中大于2小于4的值:"+filterList3);
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog("red"));
dogs.add(new Dog("yellow"));
dogs.add(new Dog("black"));
Predicate<Dog> dogPredicate = dog -> "yellow".equals(dog.getColor());
boolean yellowdogMatch = dogs.stream().anyMatch(dogPredicate);
System.out.println(yellowdogMatch?"有小黄狗":"没有小黄狗");
boolean balckdogMatch = dogs.stream().anyMatch(x -> "black".equals(x.getColor()));
System.out.println(balckdogMatch?"有小黑狗":"没有小黑狗");
boolean whitedogMatch = dogs.stream().anyMatch(x -> "white".equals(x.getColor()));
System.out.println(whitedogMatch?"有小白狗":"没有小白狗");
}
private static class Dog{
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Dog(String color) {
this.color = color;
}
}
}