一、lambda含义
    lambda表示数学符号“λ”,计算机领域中λ代表“λ演算”,表达了计算机中最基本的概念:“调用”和“置换”。在很多动态语言和C#中都有相应的lambda语法,这类语法都为了简化代码,提高运行效率。

二、lambda 项目的背景,参考这里。

    无论是面向对象语言还是函数式语言,基本数值都可以被动态的封装入程序动作:面向对象语言通过“方法”,函数式语言通过“函数。

    介于“方法”和“函数”的定义有很多种,补充下IBM知识库的解释:

在面向对象语言中,方法不是一阶值(First-class value),在函数式语言中,函数是一阶值。在函数式语言中,函数可以作为另一个函数的返回值或参数,还可以作为一个变量的值,函数可以嵌套定义,而在面向对象语言中的的“方法”做不到这点。

   
Java可以说是面向对象语言的代表,如果要调用其方法,需要先创建对象。不过Java对象都是“重量级”的,实例化具体的类的对象,需要经过定义和申明
两个阶段。比如定义方法,并给内部字段赋初始值。但是一个对象只包含一个方法的情况很多,比如实现API中的“回调接口”功能的类,在swing中有接
口:

Java代码 

public interface ActionListener {  

    void actionPerformed(ActionEvent e); 

}

现有的实现方式大多是:

Java代码 

button.addActionListener(new ActionListener() {  

  public void actionPerformed(ActionEvent e) {  

    ui.dazzle(e.getModifiers()); 

  } 

});

很多现有的类库都基于这种设计实现,所以对于代码被明确定义运行在单独线程的API来说,匿名内部类尤为重要。这些匿名内部类只存在于创建它的线程中。但
是在并行计算领域,CPU的制造商着力发展多核技术来提升CPU的功能,这么做几乎无法依靠多核的优势来提升其性能。

鉴于回调函数和其他功能式语法的关系越来越密切,所以必须建立尽可能的轻量级的数据模型(从编码角度而言,性能方面下文再说)。对于这点来说匿名内部类的缺点如下:

1. 语法相对复杂。

2. 在调用内部类的上下文中,指引和this的指代容易混淆。

3. 类加载和实例创建语法不可避免。

4. 不能引用外部的非final对象。

5. 不能抽象化控制流程

针对这些问题,lambda项目致力于

1. 消除问题1和问题2,通过引入更简单的表达式和局部变量的定义规则。

2. 回避问题3,定义更灵活更友善的语法。这里只是回避,类加载和实例化本身不可避免。下文会解释。

3. 改善问题4,允许用户使用最终有效的局部变量。

不过lambda项目目前并不能解决所有关于内部类的问题。问题4和问题5没有完全解决,这计划在将类版本中继续改善。对于性能方面,原文也没有提,不过后面有些补充。

三、lambda用法

   
通过上文可以了解到,lambda语法是针对“回调接口”和“匿名内部类”作出的改进,所以lambda的语法目前仅对于部分接口,这些接口的特点是只含
一个抽象方法,在lambda项目中,早期称为SAM类型(SAM = single abstract method
即单一抽象方法)。在最新的文档中(即这个版本),它们有了新名字,叫函数接口(functional interface),比如:

1 java.lang.Runnable

2 java.util.concurrent.Callable

3 java.security.PrivilegedAction

4 java.util.Comparator

5 java.io.FileFilter

6 java.nio.file.PathMatcher

7 java.lang.reflect.InvocationHandler

8 java.beans.PropertyChangeListener

9 java.awt.event.ActionListener

10 javax.swing.event.ChangeListener

lambda的语法包括三部分

1、参数列表

2、箭头符号"->"

3、代码块。

其中代码块很像一个方法体,return语句将控制权交还给匿名方法(anonymous
method,即lambda表达式)的调用者;break和continue不能出现在函数体的顶部,不过可以出现在内部的循环里;如果代码块得出最终
结果,那么每一个控制路径(control path) 必须都有返回或抛出异常。

如果代码块只有简单一行,可以省略return关键字和“{}”符号(以下所写的例子都是基于JDK 1.8 lambda预览版),比如:

Java代码 

public class LambdaTest {    

    public static void main(String... args) { 

        //这里有{}和return 以及 ; 

        Runnable r = () -> { System.out.println("hello world"); }; 

         

        //这里不需要{}和return 

        java.util.Comparator<String> c = (String s1, String s2) -> s2.length()-s1.length();         

        r.run(); 

        System.out.println(c.compare("s1", "12323")); 

    } 

}

输出为:

hello world

3

除了这些现有接口,我们还可以自定义函数接口:

Java代码 

public class LambdaTest { 

    interface lambdaInterface { 

        public void me(String str); 

    } 

 

    public static void main(String... args) { 

        lambdaInterface li = (String s)->{System.out.println(s);}; 

        li.me("hello world!"); 

    } 



输出为:

hello world!

新的lambda方法从语法上的确是简化了很多。和lambda第一次发布的语法相比也优雅很多。

(转)JDK 1.8 预览版Lambda语法分析的更多相关文章

  1. VS2015预览版中的C#6.0 新功能(二)

    VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(三) 自动属性的增强 只读自动属性 以前自动属性必须同时提供setter和getter方法,因而只读属性只能通 ...

  2. Apache Spark 3.0 预览版正式发布,多项重大功能发布

    2019年11月08日 数砖的 Xingbo Jiang 大佬给社区发了一封邮件,宣布 Apache Spark 3.0 预览版正式发布,这个版本主要是为了对即将发布的 Apache Spark 3. ...

  3. .NET 7 预览版 1 发布

    宣布 .NET 7 预览版 1 Jeremy 2022 年 2 月 17 日 今天,我们很高兴地宣布 .NET 历史上的下一个里程碑.在庆祝社区和 20 年创新的同时,.NET 7 Preview 1 ...

  4. [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)

    前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...

  5. 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

    微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容 ...

  6. Win10桌面预览版14316更新内容大全

    下载更新: 安装之后右下角: Win10桌面预览版14316更新内容:       Windows上运行乌班图Bash:通过设置开启开发者模式,更新和安全>面向开发人员.然后搜索"Wi ...

  7. .NET 4.5.1 预览版新特性

    上个月的微软Build大会上宣布了.NET 4.5.1的推出,Heydarian的这个演讲题为".NET开发中的新内容",涵盖了.NET Framework中一些重要的新特性. H ...

  8. Windows 10 技术预览版9926 “未知源”引起系统休眠后自启的解决办法

    问题的由来: 自从安装上了最新发布的Windows 10 ,使用起来有诸多的改进:无论是重绘的图标还是通知消息中心的整合还是更智能的OneDrive客户端都使得工作起来非常愉悦. 不过笔者这两天频繁遇 ...

  9. Windows 10预览版14316开启Bash命令支持

    00x0 前言 4月7日凌晨,微软推送了最新的Windows 10一周年更新预览版14316,其中重要的是原生支持Linux Bash命令行支持. 00x1 问题 如何开启Linux Bash命令行? ...

随机推荐

  1. SpringMVC+Spring+Hibernate整合开发

    最近突然想认真研究下java web常用框架,虽然现在一直在用,但实现的整体流程不是很了解,就在网上搜索资料,尝试自己搭建,以下是自己的搭建及测试过程. 一.准备工作: 1/安装并配置java运行环境 ...

  2. oAuth2授权协议 & 微信授权登陆和绑定 & 多环境共用一个微信开发平台回调设置

    OAuth2(open Auth)开放授权协议 授权码模式流程: 1.浏览器(客户端)点击一个比如使用微信登陆按钮 2.会跳到认证服务器页面,让用户选择是否授权 3.如果用户点击授权,那么会跳转到开始 ...

  3. Python编码规范(PEP8)

    Introduction 介绍 本文提供的Python代码编码规范基于Python主要发行版本的标准库.Python的C语言实现的C代码规范请查看相应的PEP指南1. 这篇文档以及PEP 257(文档 ...

  4. java实现http请求

    String apiUrl = "https://api.seniverse.com/v3/weather/now.json?key=" + key + "&lo ...

  5. Linux 服务器运行健康状况监控利器 Spotlight on Unix 的安装与使用

    1.本文背景 1.1.Linux 服务器情况 # cat /etc/issueRed Hat Enterprise Linux Server release 6.1 (Santiago)Kernel ...

  6. 你好!酷痞 Coolpy

    欢迎你进入酷痞的物联网世界.这里有着自由的空气和自然的气息.接下来我将告诉你如果一步步建立一个自己专属的物联网平台. 由于目前的酷痞的官方域名还没有通过备案所以现在用临时域名解说本说明. 最终酷痞的官 ...

  7. es ik分词插件安装

    1.ik下载(下载es对应版本的ik分词包) https://github.com/medcl/elasticsearch-analysis-ik/releases 2.mac cd /usr/loc ...

  8. python基础篇_005_迭代器和生成器

    Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...

  9. Wxpython入门

    Wxpython入门 api文档以及中文教程: https://pan.baidu.com/s/1TDTgHg9Mwc74ODQy68YnlQ 提取码:354n 入门示例 frame=wx.Frame ...

  10. 如何配置.Net Core Centos守护进程配置

    一.安装supervisor 运行命令 yum install supervisor 二.配置supervisor 1.运行命令创建文件夹 mkdir -p /etc/supervisor/conf. ...