JAVA 8 函数式编程四接口--Predicate

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()方法:

  1. and()方法:将两个Predicate组合成一个Predicate,并返回一个新的Predicate对象,它表示两个Predicate同时成立的条件。
default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
}

  1. or()方法:将两个Predicate组合成一个Predicate,并返回一个新的Predicate对象,它表示两个Predicate中的至少一个条件成立。
default Predicate<T> or(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) || other.test(t);
}

  1. 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;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值