您的位置:首页 > 编程语言 > Java开发

JavaSE_8系列博客——Java8的新特性(一)--Lambda表达式(1)--宏观把控

2017-09-30 07:12 716 查看
Why Lambda 表达式

什么是Lambda
内涵

外延相关的易混概念
函数式编程和Lambda

高阶函数和Lambda

匿名函数和Lambda

闭包和Lambda

内部类匿名类匿名内部类局部类和Lambda

JavaScript中的回调函数和Lambda

c中的委托和Java中的Lambda

Lambda和流式Stream编程的关系

Java的stream和C中的LINQ

Lambda表达式和设计模式

小结

Lambda表达式的原理

如何高效使用Lambda
哪里需要Lambda以及哪里不需要

迁移到Lambda有什么注意事项

实战演练

总结

Why Lambda 表达式?

解决匿名内部类的垂直问题:

匿名内部类最大的痛楚就是笨重(冗繁、可读性差)。我们可以称之为“垂直问题”

Lambda表达式是匿名方法,旨在使用轻量级机制代替匿名内部类的机械性来解决“垂直问题”。

使Java拥有处理复杂集合处理算法的能力,而且只需要简单修改一个方法,就能让代码在多核CPU上高效运行。为了编写这样的处理批量数据的并行类库,对java7进行了修改 : 增加了lambda表达式

提高代码可读性,代码更加易于维护、更可靠、更不容易出错

能让事件处理系统编程变得更加简单

使得编写惰性的代码变得容易,在真正需要时采取初始化变量的值。

什么是Lambda?

内涵:

所谓的lambda表达式,简单来说它其实就是 x 到 y 的映射关系, 但在大部分支持函数式的编程语言中, 它等价于匿名函数。被称为 lambda 表达式. 因为这些函数只需要用一次, 而且变换不复杂, 完全不需要命名 。

外延:(相关的易混概念)

函数式编程和Lambda

第一,要搞清楚什么是函数式编程。

参考博客:

阮一峰的博客

请参见系列博客:

https://www.ibm.com/developerworks/cn/java/j-ft20/index.html?ca=drs-

https://www.ibm.com/developerworks/cn/java/j-ft4/index.html?ca=drs-

https://www.ibm.com/developerworks/cn/java/j-ft1/index.html?ca=drs-

https://www.ibm.com/developerworks/cn/java/j-ft2/index.html?ca=drs-

https://www.ibm.com/developerworks/cn/java/j-ft3/index.html?ca=drs-

高阶函数和Lambda

第一步:高阶函数的定义是什么?

操作函数的函数:一个函数可以接受另一个函数作为参数,也可以把一个函数作为结果来返回。

参考博客:JavaScript中的高阶函数

匿名函数和Lambda

首先:什么是匿名函数?

参考:匿名函数

匿名函数在程序中的作用是可以作为参数传给高阶函数[1], 或者作为闭包被返回 。

参考:c#中的匿名函数

闭包和Lambda

搞清楚,到底什么是闭包?闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的用处:它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

参考博客:

JavaScript中的闭包

闭包在不同语言中的表现和实现

内部类、匿名类、匿名内部类、局部类和Lambda

内部类、匿名类、匿名内部类、局部类这些技术都是Java中实现闭包,也就是函数式编程的基础。

参考博客:

javaSE8培训手册

参考下博客:(里面写到了JavaScript、c#、Java中实现闭包的形式)

http://blog.csdn.net/u013034750/article/details/41412115

JavaScript中的回调函数和Lambda

搞明白,到底什么是回调函数?

回调函数来自一种著名的编程范式——函数式编程。函数式编程最主要的技术之一就是回调函数,你很快会阅读到,实现回调函数就像传递一般的参数变量一样简单。

回调函数是闭包的,当作为参数传递一个回调函数给另一个函数时,回调函数将在包含函数函数体内的某个位置被执行,就像回调函数在包含函数的函数体内定义一样。这意味着回调函数是闭包的,众所周知,闭包函数可以访问包含函数的作用域,所以,回调函数可以访问包含函数的变量,甚至是全局变量。

参考博客:JavaScript中的回调函数

c#中的委托和Java中的Lambda

参考博客:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/index

https://docs.microsoft.com/zh-cn/dotnet/standard/delegates-lambdas

Lambda和流式(Stream)编程的关系

所有 Stream 的操作必须以 lambda 表达式为参数

参考博客:

Java 8 中的 Streams API 详解

Java的stream和C#中的LINQ

简单来说,Java学了C# 的LINQ的思想。

参考博客:

java8中的Stream操作

参考博客:

https://www.oschina.net/translate/does-java-8-still-need-linq-or-is-it-better-than-linq

Lambda表达式和设计模式

未完待续……

小结:

Lambda表达式的原理:

Java中,lambda表达式的实现是基于内部类+静态方法的,利用内部类可形成Java中的闭包。并且生成一个静态的私有方法,这个静态的私有函数就是lambda表达式的内容。

参考:

http://www.cnblogs.com/WJ5888/p/4667086.html

http://blog.csdn.net/raintungli/article/details/54910152

内部类和闭包的可参考博客:

http://www.jianshu.com/p/f55b11a4cec2

如何高效使用Lambda?

哪里需要Lambda?以及哪里不需要

参考博客: lambda表达式的应用场景

迁移到Lambda有什么注意事项?

参考博客:

https://www.oschina.net/translate/hacking-lambda-expressions-in-java?print

实战演练

参考:

http://www.importnew.com/16436.html

总结:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java se 函数 java
相关文章推荐