美文网首页
JAVA 8 函数式接口--Predicate

JAVA 8 函数式接口--Predicate

作者: 木子小三金 | 来源:发表于2018-08-31 10:13 被阅读0次

    从JDK8开始java支持函数式编程,JDK也提供了几个常用的函数式接口,这篇主要介绍Predicate接口。
    文本介绍的顺序依次为:

    • 源码介绍
    • 使用示例
    • JDK内Predicate的使用举例
    • 扩展类介绍

    源码介绍

    package java.util.function;
    
    import java.util.Objects;
    
    /**
     * 提供了对输入的参数进行断定并返回boolean类型能力的函数式接口
     *
     */
    @FunctionalInterface
    public interface Predicate<T> {
    
        /**
         * 基于输入的参数进行断定,并返回boolean类型
         *
         */
        boolean test(T t);
    
        /**
         * 逻辑“与”判断,接收一个Predicate类型参数。
         * 优先对自身逻辑进行断定,若断定为true则进行参数other断定;否则不对other断定
         * 若断定期间发生异常,停止所有断定并将异常传递给调用者
         */
        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);
        }
    
        /**
         * 逻辑“或”判断,接收一个Predicate类型参数。
         * 优先对自身逻辑进行断定,若断定为true则不对参数other断定;否则对other断定
         * 若断定期间发生异常,停止所有断定并将异常传递给调用者
         */
        default Predicate<T> or(Predicate<? super T> other) {
            Objects.requireNonNull(other);
            return (t) -> test(t) || other.test(t);
        }
    
        /**
         * 可设置一个参数,并对后续所有调用test传入数与该参数进行equals比较
         */
        static <T> Predicate<T> isEqual(Object targetRef) {
            return (null == targetRef)
                    ? Objects::isNull
                    : object -> targetRef.equals(object);
        }
    }
    

    下面来看一下具体的使用方法。

    使用示例

    package jdk8.function;
    
    import java.util.function.Predicate;
    
    public class PredicateDemo {
    
        public static void main(String[] args) {
            PredicateDemo predicateDemo = new PredicateDemo();
            predicateDemo.simpleDemo();
        }
    
        public void simpleDemo(){
            Predicate<Integer> predicate = i -> i > 10;
            Predicate<Integer> other = i -> i < 20;
    
            Integer param = 10;
            String str = "demo";
    
            System.out.println(param + ">10:" + predicate.test(param));
            System.out.println(param + " > 10 and " + param + " < 20:" + predicate.and(other).test(111));
            System.out.println(param + " > 10 or " + param + " < 20:" + predicate.or(other).test(30));
            System.out.println("!("+param+" > 10):" + predicate.negate().test(0));
            System.out.println("demo.equal("+str+"):" + Predicate.isEqual("demo").test("demo"));
        }
    
    }
    
    

    下面是输出结果:

    10>10:false
    10 > 10 and 10 < 20:false
    10 > 10 or 10 < 20:true
    !(10 > 10):true
    demo.equal(demo):true
    

    个人觉得这个函数式接口是一个非常好用的工具,可以实现一些校验器、过滤器的功能。

    JDK内Predicate的使用举例

    Collection接口提供了一个默认的方法removeIf,使用者可以根据自定义的filter对集合内的元素进行移除。代码如下:

    default boolean removeIf(Predicate<? super E> filter) {
            Objects.requireNonNull(filter);
            boolean removed = false;
            final Iterator<E> each = iterator();
            while (each.hasNext()) {
                if (filter.test(each.next())) {
                    each.remove();
                    removed = true;
                }
            }
            return removed;
        }
    

    Predicate扩展接口

    类名 描述
    BiPredicate 提供了接收2个参数的断定功能
    DoublePredicate 提供了接收double类型参数的断定功能
    IntPredicate 提供了接收int数的断定功能
    LongPredicate 提供了接收long的断定功能

    相关文章

      网友评论

          本文标题:JAVA 8 函数式接口--Predicate

          本文链接:https://www.haomeiwen.com/subject/puxswftx.html