JDK8特性之lambda表达式浅识

序语

一直在用JDK8,但是为什么要用JDK8呢,和jdk1.7的区别又在哪里,以前从来没认真思考过这些个问题,偶然间见到这样一段代码:

new Thread( () -> {
	……;
}) ).start();

发现自己完全属于懵逼状态,于是开始新的征程。学习是件快乐的事情,特别是当你发现之前一直不理解的某个事情,忽然茅塞顿开,理解了,其实也就那样,但是心中却是满满的满足感。

lambda表达式浅识

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

以上一段话来自百度百科,然而对于我来说,这就是一堆的天书,因此我到在很多大牛的博客中找到了挺多相关的解释,自己整理了一下,在此谈谈个人简单的理解。至于借鉴了哪些人的文章,这里就不一一去回顾了,看了太多了,之前一直不理解,也不知道怎么去用,永远只有一个用法:
new Thread( () -> {
……;
}) ).start();
今天忽然理解了。。原来就是这么一回事。

首先我们也从上面这段代码开始理解,首先看new thread().start(),原本括号中应该是:
new Runable(){
public void run() {
}
}
然后在run方法中添加具体的逻辑代码,但是,在lambda表达式中,以上一串代码被以下代码代替了:
() ->{}
首先看到这个括号,其实我的理解这个括号就是代表着run方法,如果说接口中的方法需要带参数,就在括号中添加相应的参数名称,参数不需要添加类型。如:
interface Test {
void test(String str);
}
在main方法中可以这样调用:
Test test = (str)-> {System.out.println(str)};
当抽象方法只有一个参数时,小括号还可以省略,如:
Test test = str-> {System.out.println(str)}; //学习了
函数体只有一条语句时,还可以这样:
Test test = str-> System.out.println(str);

写到这里,我又悟了上面百度百科解释上的一个词了:匿名函数,其实我更倾向于匿名类的解释,应该说(str)-> {System.out.println(str)}; 这句代码就是一个实现Test接口的匿名类。而花括号中的函数体就是匿名函数了。

lambda表达式使用注意事项

1、 使用Lambda表达式必须要有接口,并且要求接口中有且仅有一个抽象方法。
如:

interface Test {
	void test1(String str);
	void test2();
}

该接口有两个抽象方法,无法使用lambda表达式。

2、Lambda表达式无类型,不能执行 ‘.’ 运算。

Test test = ((str)-> {System.out.println(str)}).toString();//这是错误的,编译器都不会让你通过。

总结

活到老学到老,在编程过程中,要对每一个用到的框架、每一个类甚至每一条语句都抱着学习的态度去对待,不要像我之前的状态,用着JDK8却不知道所以然用它。有多少朋友是和我一样的呢,想必应该也不少吧,希望看到这篇文章,能重新认识自己,重新认识编程。共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值