美文网首页
函数式接口

函数式接口

作者: 离人歌 | 来源:发表于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。

相关文章

  • java基础-day23-函数式接口和Stream流

    函数式接口和Stream 1. 函数式接口 1.1 函数式接口概述 1.2 常用函数式接口 1.3 比较器函数式接...

  • 2020-07-04【函数式接口】

    函数式接口概述 函数式接口作为方法的参数 函数式接口作为方法的返回值 常见的函数式接口 Supplier接口 Co...

  • 12.函数式接口

    主要内容 自定义函数式接口 函数式编程 常用函数式接口 第一章 函数式接口 1.1 概念 函数式接口在Java中是...

  • 函数式接口

    函数式接口 一、函数式接口的定义   函数式接口:函数式接口中有且仅有一个抽象方法,这个抽象方法的意义在于表达某种...

  • 测验:函数式接口

    下面哪些接口是函数式接口? 答案:只有Adder是函数式接口。SmartAdder不是函数式接口,因为它定义了两个...

  • Java8系列:神奇的函数式接口

    01 函数式接口是什么? 有且只有一个抽象方法的接口被称为函数式接口,函数式接口适用于函数式编程的场景,Lambd...

  • 函数式接口和Lambda表达式深入理解

    0x00 函数式接口 前面讲了一下函数式接口,不过可能只是讲了个大概,大致讲了一下什么是函数式接口 函数式接口就是...

  • java8函数式接口

    一、函数式接口 1、函数式接口在java中是指:有且仅有一个抽象方法的接口,函数式接口,即适用于函数式编程场景的接...

  • Java 8 知多少

    一、函数式接口 函数式接口的定义: 函数式接口(Functional Interface)就是一个有且仅有一个抽象...

  • Java lambda表达式

    1. Java函数式接口 Java实现函数式编程的方式是函数式接口(functional interface),函...

网友评论

      本文标题:函数式接口

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