美文网首页
函数式接口

函数式接口

作者: 离人歌 | 来源:发表于2017-06-21 15:18 被阅读117次

    函数式接口

    函数式接口本质是一个接口,但是他是一个只有一个抽象方法的特殊接口。也称作SAM接口,即Single Abstract Method interfaces。举一个常举的例子:

    
    @FunctionalInterface
    public interface Predicate<T> {
    
        boolean test(T t);
    
    
        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);
        }
    
    
        default Predicate<T> or(Predicate<? super T> other) {
            Objects.requireNonNull(other);
            return (t) -> test(t) || other.test(t);
        }
    
    
        static <T> Predicate<T> isEqual(Object targetRef) {
            return (null == targetRef)
                    ? Objects::isNull
                    : object -> targetRef.equals(object);
        }
    }
    

    函数接口可以(可以而不是必须)采用@FunctionalInterface 注解,
    可以包涵以下成员:

    1. 用default 定义的默认方法,默认方法不是抽象的,其包涵一个默认实现。(也就是有方法体)
    2. 用static 定义的静态方法,静态方法是一个已经实现了的方法,不是抽象方法。
    3. Object类自带的方法,如toString,equals等方法。

    必须包含以下

    必须有一个抽象方法。因为函数接口本质是接口,所以不需要abstract修饰。
    

    函数接口的继承,函数接口也可以继承,但是无论继承几个接口,继承后的函数接口必须只有一个抽象方法(这个方法可以是定义在自己,也可以是继承自父接口),如果有多个,那么这个接口就不是函数接口。

    编写的时候如果加入@FunctionalInterface有助于编译检查,不符合以上条件的函数接口是会报错的。

    @FunctionalInterface
    public interface PczhuFunctionInterface {
        int pczhu(int a);
    }
    
    

    可以普通实现:

    PczhuFunctionInterface pczhuFunctionInterfaceimpl = new PczhuFunctionInterface() {
       @Override
       public int pczhu(int a) {
             return a + 5;
        }
    };
    

    也可以用lambda表达式

        PczhuFunctionInterface pczhuFunctionInterfaceImpl = a -> a + 5;
    

    JDK 1.8 新增加的函数接口:(表格取材位置:http://blog.csdn.net/yangjiachang1203/article/details/52619795

    序号 说明
    1 BiConsumer<T,U>
    代表了一个接受两个输入参数的操作,并且不返回任何结果
    2 BiFunction<T,U,R>
    代表了一个接受两个输入参数的方法,并且返回一个结果
    3 BinaryOperator<T>
    代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
    4 BiPredicate<T,U>
    代表了一个两个参数的boolean值方法
    5 BooleanSupplier
    代表了boolean值结果的提供方
    6 Consumer<T>
    代表了接受一个输入参数并且无返回的操作
    7 DoubleBinaryOperator
    代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
    8 DoubleConsumer
    代表一个接受double值参数的操作,并且不返回结果。
    9 DoubleFunction<R>
    代表接受一个double值参数的方法,并且返回结果
    10 DoublePredicate
    代表一个拥有double值参数的boolean值方法
    11 DoubleSupplier
    代表一个double值结构的提供方
    12 DoubleToIntFunction
    接受一个double类型输入,返回一个int类型结果。
    13 DoubleToLongFunction
    接受一个double类型输入,返回一个long类型结果
    14 DoubleUnaryOperator
    接受一个参数同为类型double,返回值类型也为double 。
    15 Function<T,R>
    接受一个输入参数,返回一个结果。
    16 IntBinaryOperator
    接受两个参数同为类型int,返回值类型也为int 。
    17 IntConsumer
    接受一个int类型的输入参数,无返回值 。
    18 IntFunction<R>
    接受一个int类型输入参数,返回一个结果 。
    19 IntPredicate
    :接受一个int输入参数,返回一个布尔值的结果。
    20 IntSupplier
    无参数,返回一个int类型结果。
    21 IntToDoubleFunction
    接受一个int类型输入,返回一个double类型结果 。
    22 IntToLongFunction
    接受一个int类型输入,返回一个long类型结果。
    23 IntUnaryOperator
    接受一个参数同为类型int,返回值类型也为int 。
    24 LongBinaryOperator
    接受两个参数同为类型long,返回值类型也为long。
    25 LongConsumer
    接受一个long类型的输入参数,无返回值。
    26 LongFunction<R>
    接受一个long类型输入参数,返回一个结果。
    27 LongPredicate
    R接受一个long输入参数,返回一个布尔值类型结果。
    28 LongSupplier
    无参数,返回一个结果long类型的值。
    29 LongToDoubleFunction
    接受一个long类型输入,返回一个double类型结果。
    30 LongToIntFunction
    接受一个long类型输入,返回一个int类型结果。
    31 LongUnaryOperator
    接受一个参数同为类型long,返回值类型也为long。
    32 ObjDoubleConsumer<T>
    接受一个object类型和一个double类型的输入参数,无返回值。
    33 ObjIntConsumer<T>
    接受一个object类型和一个int类型的输入参数,无返回值。
    34 ObjLongConsumer<T>
    接受一个object类型和一个long类型的输入参数,无返回值。
    35 Predicate<T>
    接受一个输入参数,返回一个布尔值结果。
    36 Supplier<T>
    无参数,返回一个结果。
    37 ToDoubleBiFunction<T,U>
    接受两个输入参数,返回一个double类型结果
    38 ToDoubleFunction<T>
    接受一个输入参数,返回一个double类型结果
    39 ToIntBiFunction<T,U>
    接受两个输入参数,返回一个int类型结果。
    40 ToIntFunction<T>
    接受一个输入参数,返回一个int类型结果。
    41 ToLongBiFunction<T,U>
    接受两个输入参数,返回一个long类型结果。
    42 ToLongFunction<T>
    接受一个输入参数,返回一个long类型结果。
    43 UnaryOperator<T>
    接受一个参数为类型T,返回值类型也为T。

    相关文章

      网友评论

          本文标题:函数式接口

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