Java8新特性之函数式接口

函数式编程

函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法。别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”。
ava8中函数式编程语法能够精简代码。
使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出。
现在我们要定义一个Consumer对象,传统的方式是这样定义的:

Consumer c = new Consumer() {
    @Override
    public void accept(Object o) {
        System.out.println(o);
    }
};

而在Java8中,针对函数式编程接口,可以这样定义:

Consumer c = (o) -> {
    System.out.println(o);
};  

上面已说明,函数式编程接口都只有一个抽象方法,因此在采用这种写法时,编译器会将这段函数编译后当作该抽象方法的实现。
如果接口有多个抽象方法,编译器就不知道这段函数应该是实现哪个方法的了。
因此,=后面的函数体我们就可以看成是accept函数的实现。

输入:->前面的部分,即被()包围的部分。此处只有一个输入参数,实际上输入是可以有多个的,如两个参数时写法:(a, b);当然也可以没有输入,此时直接就可以是()。
函数体:->后面的部分,即被{}包围的部分;可以是一段代码。
输出:函数式编程可以没有返回值,也可以有返回值。如果有返回值时,需要代码段的最后一句通过return的方式返回对应的值。
当函数体中只有一个语句时,可以去掉{}进一步简化:

Consumer c = (o) -> System.out.println(o);

然而这还不是最简的,由于此处只是进行打印,调用了System.out中的println静态方法对输入参数直接进行打印,因此可以简化成以下写法:

Consumer c = System.out::println;

它表示的意思就是针对输入的参数将其调用System.out中的静态方法println进行打印。
到这一步就可以感受到函数式编程的强大能力。
通过最后一段代码,我们可以简单的理解函数式编程,Consumer接口直接就可以当成一个函数了,这个函数接收一个输入参数,然后针对这个输入进行处理;当然其本质上仍旧是一个对象,但我们已经省去了诸如老方式中的对象定义过程,直接使用一段代码来给函数式接口对象赋值。
而且最为关键的是,这个函数式对象因为本质上仍旧是一个对象,因此可以做为其它方法的参数或者返回值,可以与原有的代码实现无缝集成!

下面是java.util.function中的函数接口描述:

1 BiConsumer<T,U> 代表了一个接受两个输入参数的操作,并且不返回任何结果

2 BiFunction<T,U,R> 代表了一个接受两个输入参数的方法,并且返回一个结果

3 BinaryOperator 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果

4 BiPredicate<T,U> 代表了一个两个参数的boolean值方法

5 BooleanSupplier 代表了boolean值结果的提供方

6 Consumer 代表了接受一个输入参数并且无返回的操作

7 DoubleBinaryOperator 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。

8 DoubleConsumer 代表一个接受double值参数的操作,并且不返回结果。

9 DoubleFunction 代表接受一个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 接受一个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 接受一个long类型输入参数,返回一个结果。

27 LongPredicate R接受一个long输入参数,返回一个布尔值类型结果。

28 LongSupplier 无参数,返回一个结果long类型的值。

29 LongToDoubleFunction 接受一个long类型输入,返回一个double类型结果。

30 LongToIntFunction 接受一个long类型输入,返回一个int类型结果。

31 LongUnaryOperator 接受一个参数同为类型long,返回值类型也为long。

32 ObjDoubleConsumer 接受一个object类型和一个double类型的输入参数,无返回值。

33 ObjIntConsumer 接受一个object类型和一个int类型的输入参数,无返回值。

34 ObjLongConsumer 接受一个object类型和一个long类型的输入参数,无返回值。

35 Predicate 接受一个输入参数,返回一个布尔值结果。

36 Supplier 无参数,返回一个结果。

37 ToDoubleBiFunction<T,U> 接受两个输入参数,返回一个double类型结果

38 ToDoubleFunction 接受一个输入参数,返回一个double类型结果

39 ToIntBiFunction<T,U> 接受两个输入参数,返回一个int类型结果。

40 ToIntFunction 接受一个输入参数,返回一个int类型结果。

41 ToLongBiFunction<T,U> 接受两个输入参数,返回一个long类型结果。

42 ToLongFunction 接受一个输入参数,返回一个long类型结果。

43 UnaryOperator 接受一个参数为类型T,返回值类型也为T。

除了上面列出的,还有个别函数接口没列出来,例如Comparator(), 但总归是个函数接口都会基于FunctionalInterface注解

总结
这些函数主要还是分为几个主要函数,其余都是以其为基础的分化;

Supplier 无参数,返回一个结果。
Consumer 代表了接受一个输入参数并且无返回的操作。
Function<T,R> 接受一个输入参数,返回一个结果,返回的结果跟参数的类型无关。
Predicate 接受一个输入参数,返回一个布尔值结果。
BinaryOperator 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果,xxxOperator 函数都是接受类型跟返回值类型相同。
而且,从上面五个主要函数接口命名也可以看出其作用,"Bi"作为前缀的都是属于二元操作,接受两个参数。
T1 to T2是从接受T1类型参数,返回T2类型结果,比如IntToLongFunction 接受一个int类型参数,返回long类型结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值