Java8 新特性之Lambda表达式以及函数式接口

1.Lambda表达式的意义与构建规则

Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念。

简单的结构:

(参数1->表达式1)

((参数1,参数2,..)->{表达式1;表达式2 ;..})

显示指定参数类型:

((String 参数1,String 参数2,..)->{表达式1;表达式2 ;..})

可以看到:如果是多个参数则必须用(),多行表达式要用{},并且用;隔开

最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

首先Arrays.asList( "a", "b", "d" )是将数组转为list因为数组不是object类型的不能直接.(点)出来方法,通过list来调用forEach方法,一个参数e,一行代码块System.out.println( e ),则省略了很多东西,完整的写法应该是:

Arrays.asList( "a", "b", "d" ).forEach((String e)->{System.out.println(e);});

2.函数式接口

Runnable接口就是标准的函数式接口,那么具体的定义:

函数式接口就是只定义一个自己的抽象方法的接口.隐藏的规则:

  • 所有的接口都继承了object的方法,所以继承了object的方法不是自己的抽象方法
  • 默认方法与静态方法不是抽象方法
  • 可以用@FunctionalInterface进行标明该接口是函数式接口,也可以不标注,但是表中之后可以自动检测该接口是否符合函数式接口的定义,类似于泛型的使用,编译的时候就可以检测出来.

例如:

@FunctionalInterface

public interface ILambda<Integer> {

 

int add(Integer o1, Integer o2);

boolean equals(Object obj);

int hashCode();

}

就是一个函数式接口.

3.Lambda表达式的使用

通过配合函数式接口我们可以更清晰的明白如何使用lambda表达式

使用上述的函数式接口,我们可以这样使用:

public class Test {

 

public static void main(String[] args) {

ILambda<Integer> lambda=(a,b) -> a+b;

Integer cInteger= lambda.add(1, 2);

System.out.println(cInteger);

}

}

可以看到,lambda表达式就是add方法的实现,准确的说箭头后面的代码块才是真正的add方法的实现,

这个代码块是我们根据业务需求临时定义的,极大的提高了代码的灵活性,我们完全可以根据需求的变动而实现不同的代码块,而不需要修改其他的代码;

具体的逻辑:

根据函数式接口的定义,只有一个抽象方法,那么我们就可以知道,lambda表达式就是这个抽象方法的实现(或者说是实例),这就是行为参数化.

注意:

这个lambda表达式必须是符合抽象方法定义的,也就是所上述的两个参数必须是Integer类型的,不能显示的定义为其他类型,当然后面的代码块中两个参数的行为也必须是符合Integer类型的.另外,如果代码块只有一行,则可以省略返回值,如果多行需要显示的return返回值,返回值类型也要符合抽象方法的声明.

欢迎参看原文:http://www.poppyflower.cn/?p=127

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱飞的笨鸟

如果帮到了你,是我最大的荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值