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有什么注意事项
实战演练
总结
匿名内部类最大的痛楚就是笨重(冗繁、可读性差)。我们可以称之为“垂直问题”
Lambda表达式是匿名方法,旨在使用轻量级机制代替匿名内部类的机械性来解决“垂直问题”。
使Java拥有处理复杂集合处理算法的能力,而且只需要简单修改一个方法,就能让代码在多核CPU上高效运行。为了编写这样的处理批量数据的并行类库,对java7进行了修改 : 增加了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-
操作函数的函数:一个函数可以接受另一个函数作为参数,也可以把一个函数作为结果来返回。
参考博客:JavaScript中的高阶函数
参考:匿名函数
匿名函数在程序中的作用是可以作为参数传给高阶函数[1], 或者作为闭包被返回 。
参考:c#中的匿名函数
闭包的用处:它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
参考博客:
JavaScript中的闭包
闭包在不同语言中的表现和实现
参考博客:
javaSE8培训手册
参考下博客:(里面写到了JavaScript、c#、Java中实现闭包的形式)
http://blog.csdn.net/u013034750/article/details/41412115
回调函数来自一种著名的编程范式——函数式编程。函数式编程最主要的技术之一就是回调函数,你很快会阅读到,实现回调函数就像传递一般的参数变量一样简单。
回调函数是闭包的,当作为参数传递一个回调函数给另一个函数时,回调函数将在包含函数函数体内的某个位置被执行,就像回调函数在包含函数的函数体内定义一样。这意味着回调函数是闭包的,众所周知,闭包函数可以访问包含函数的作用域,所以,回调函数可以访问包含函数的变量,甚至是全局变量。
参考博客:JavaScript中的回调函数
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/index
https://docs.microsoft.com/zh-cn/dotnet/standard/delegates-lambdas
参考博客:
Java 8 中的 Streams API 详解
参考博客:
java8中的Stream操作
参考博客:
https://www.oschina.net/translate/does-java-8-still-need-linq-or-is-it-better-than-linq
参考:
http://www.cnblogs.com/WJ5888/p/4667086.html
http://blog.csdn.net/raintungli/article/details/54910152
内部类和闭包的可参考博客:
http://www.jianshu.com/p/f55b11a4cec2
https://www.oschina.net/translate/hacking-lambda-expressions-in-java?print
http://www.importnew.com/16436.html
什么是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
总结:
相关文章推荐
- javaSE_8系列博客——Java语言的特性(三)--类和对象(19)--嵌套类(Lambda 表达式)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(20)--嵌套类(Lambda 表达式--VS--方法引用)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(21)--何时使用Lambda 表达式?
- javaSE_8系列博客——Java语言的特性(三)--类和对象(2)--类(宏观概述)
- javaSE_8系列博客——Java语言的特性(五)--接口和继承(1)--宏观把控
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(6)-- 表达式、语句、块
- JavaSE_8系列博客——Java语言的特性(六)--泛型(1)--宏观把控
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(5)-- 运算符
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(1)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(13)--理解类的成员
- javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法
- javaSE_8系列博客——Java语言的特性(三)--类和对象(17)--嵌套类(本地/局部类)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(10)--对象的使用
- javaSE_8系列博客——Java语言的特性(三)--类和对象(4)--声明成员变量
- javaSE_8系列博客——Java语言的特性(四)--注解--(2)-- 声明一个注解
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(3)-- 基本数据类型的默认值
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(7)-- 流程控制语句
- javaSE_8系列博客——Java语言的特性(三)--类和对象(11)--从方法返回值
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--使用this关键字
- JavaSE_8系列博客——Java语言的特性(六)--泛型(5)--泛型的使用