暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

认识Java8 中的@FunctionalInterface 注解

技术流张张 2021-09-11
1163

@FunctionalInterface 函数是java8中的新特性,为了标识一个函数式接口。



1. 该注解只能标记在“有且仅有一个抽象方法”的接口上

2. jdk8接口中的静态方法和默认方法,都不算是抽象方法。

3. 接口默认继承 java.lang.Object,所以接口显示声明覆盖了Object中的方法,那么也不算抽象方法

4. 该注解不是必须的,如果一个接口符合函数式接口的定义,那么加不加接口都不是很重要。加上更够更好的让编译器进行检查,如果不是函数式接加上这个注解则会报错

    /**
    * Represents a predicate (boolean-valued function) of one argument.
    *
    * <p>This is a <a href="package-summary.html">functional interface</a>
    * whose functional method is {@link #test(Object)}.
    *
    * @param <T> the type of the input to the predicate
    *
    * @since 1.8
    */
    @FunctionalInterface
    public interface Predicate<T> {


    /**
    * Evaluates this predicate on the given argument.
    *
    * @param t the input argument
    * @return {@code true} if the input argument matches the predicate,
    * otherwise {@code false}
    */
    boolean test(T t);


    /**
    * Returns a composed predicate that represents a short-circuiting logical
    * AND of this predicate and another. When evaluating the composed
    * predicate, if this predicate is {@code false}, then the {@code other}
    * predicate is not evaluated.
    *
    * <p>Any exceptions thrown during evaluation of either predicate are relayed
    * to the caller; if evaluation of this predicate throws an exception, the
    * {@code other} predicate will not be evaluated.
    *
    * @param other a predicate that will be logically-ANDed with this
    * predicate
    * @return a composed predicate that represents the short-circuiting logical
    * AND of this predicate and the {@code other} predicate
    * @throws NullPointerException if other is null
    */
    default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
    }


    /**
    * Returns a predicate that represents the logical negation of this
    * predicate.
    *
    * @return a predicate that represents the logical negation of this
    * predicate
    */
    default Predicate<T> negate() {
    return (t) -> !test(t);
    }


    /**
    * Returns a composed predicate that represents a short-circuiting logical
    * OR of this predicate and another. When evaluating the composed
    * predicate, if this predicate is {@code true}, then the {@code other}
    * predicate is not evaluated.
    *
    * <p>Any exceptions thrown during evaluation of either predicate are relayed
    * to the caller; if evaluation of this predicate throws an exception, the
    * {@code other} predicate will not be evaluated.
    *
    * @param other a predicate that will be logically-ORed with this
    * predicate
    * @return a composed predicate that represents the short-circuiting logical
    * OR of this predicate and the {@code other} predicate
    * @throws NullPointerException if other is null
    */
    default Predicate<T> or(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) || other.test(t);
    }


    /**
    * Returns a predicate that tests if two arguments are equal according
    * to {@link Objects#equals(Object, Object)}.
    *
    * @param <T> the type of arguments to the predicate
    * @param targetRef the object reference with which to compare for equality,
    * which may be {@code null}
    * @return a predicate that tests if two arguments are equal according
    * to {@link Objects#equals(Object, Object)}
    */
    static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)
    ? Objects::isNull
    : object -> targetRef.equals(object);
    }
    }



    结论:

    Predicate 是一个很重要的 函数式接口 如上所示  default/static 都不是抽象方法 只有一个test 抽象方法


    文章转载自技术流张张,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论