lambda从使用上来说,第一感觉直白的理解就是,少了很多不必要的匿名回调类的写法,比如:

    public static void main(String[] args) {
PlatformQuery query = new PlatformQuery().createDemo();
Runnable c = () -> { System.out.println(JsonUtils.toJson(query)); };
Thread thread = new Thread(c);
thread.start();
}

对着这段代码,会打印出:

{"lists":[{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"},{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"}]}

在java 8以前,如果我们要启动一个新线程,就需要创建一个新的类或者匿名实现类,实现Runnable接口中的run()方法,然后作为参数传递个Thread来完成。

使用lambda之后,就不需要新建一个实现Runaable接口的类,直接在主线程上下文中就可以完成。其中run()实现的内容就是上文的{ System.out.println(JsonUtils.toJson(query)); };,()则是run方法的签名。

从代码直观性上来说,确实简化了很多。

再比如,对于list排序,在java 8中,我们可以直接使用list.sort(Comparator),如下所示:

        query.getLists().sort(new Comparator<Platform>() {

            @Override
public int compare(Platform a, Platform b) {
return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length());
} });

采用lambda表达式之后,我们可以使用以下两种写法:

        Comparator<Platform> com = (Platform a, Platform b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); };
query.getLists().sort(com); query.getLists().sort((Platform a, Platform b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); }); -- 这是直接使用匿名lambda表达式的例子

进一步的,lambda能够自动推导上下文,比泛型的编译时擦除(erase)还要进一步,如下:

        Comparator<Platform> com1 = (a,b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); };

        query.getLists().sort(com1);

        query.getLists().sort((a, b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); });

从上文可以看出,这比较像jquery中绑定事件的常见用法,凡事通过传递一个匿名函数来解决,对于基于Java的GUI编程或者使用future、以及spring JDBC等广泛依赖回调函数的应用来说,可以使代码去除很多不必要的skeleton代码。

从语义上来看,使用lambda表达式的一个较大差别是,使用lambda实现原来匿名类的功能在生成字节码时不会自动生成匿名类,这可以通过查看生成的class文件知道。更大的差别是,lambda不会生成新的独立上下文,也就是在lambda块中可以访问所在上下文的各种变量和函数,如下所示:

    public static void main(String[] args) {
SpiderActionV2 action = new SpiderActionV2();
action.lambdaTest();
} public void lambdaTest() {
PlatformQuery query = new PlatformQuery().createDemo();
Runnable c = () -> { callMainFunc(query);
System.out.println(this.getClass().getCanonicalName()); };
Thread thread = new Thread(c);
thread.start();
} /**
*
*/
private void callMainFunc(PlatformQuery query) {
System.out.println(JsonUtils.toJson(query));
}

输出如下:

{"lists":[{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"},{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"}]}
com.ld.net.spider.demo.action.v2.SpiderActionV2

PS:java 8的完整新特性官方说明可见http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html。

java各个版本的语言特性重大变更可见http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html。

深入浅出java 8 lambda表达式--零基础一分钟入门的更多相关文章

  1. 深入浅出 Java 8 Lambda 表达式

    摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...

  2. 转载:深入浅出 Java 8 Lambda 表达式

    原文地址:http://viralpatel.net/blogs/Lambda-expressions-java-tutorial/ OneAPM for Java 能够深入到所有 Java 应用内部 ...

  3. 函数:lambda表达式 - 零基础入门学习Python021

    函数:lambda表达式 让编程改变世界 Change the world by program lambda表达式 Python允许使用lambda关键字来创建匿名函数.我们提到一个新的关键字:匿名 ...

  4. 零基础一分钟入门Python

    这篇文章面向所有想学python的小伙伴(甚至你从没听过编程),这篇文章将会带你以最快的速度入门python.赶快上车,时间来不及了... 一,下载和安装python 1.下载: 1.1 python ...

  5. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  6. Java 8 Lambda 表达式详解

    一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...

  7. Java 8 Lambda表达式

    Java 8 Lambda表达式探险 http://www.cnblogs.com/feichexia/archive/2012/11/15/Java8_LambdaExpression.html 为 ...

  8. Java 8 Lambda表达式10个示例【存】

    PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...

  9. Java 8 Lambda 表达式

    Lambda 是啥玩意 简单来说,Lambda 就是一个匿名的方法,就这样,没啥特别的.它采用一种非常简洁的方式来定义方法.当你想传递可复用的方法片段时,匿名方法非常有用.例如,将一个方法传递给另外一 ...

随机推荐

  1. C# 调用百度地图Web服务API

    最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...

  2. struts1的ActionForm的作用域(生命周期)

    转自:http://biancheng.dnbcw.info/java/240347.html 今天查找一个问题:我在列表页面添加一个查询条件,然后查询符合条件的数据.查询结果正确.然后我进入其它菜单 ...

  3. itextpdf JAVA 输出PDF文档

    使用JAVA生成PDF的时候,还是有些注意事项需要处理的. 第一.中文问题,默认的itext是不支持中文的,想要支持,需要做些处理. 1.直接引用操作系统的中文字体库支持,由于此方案限制性强,又绑定了 ...

  4. centos 7 卸载 mariadb 的正确命令

    #列出所有被安装的rpm package rpm -qa | grep mariadb #卸载 rpm -e mariadb-libs-5.5.37-1.el7_0.x86_64 错误:依赖检测失败: ...

  5. Linux下打开串口设置

    给出打开串口函数 int open_tty(char tty[]) { int fd; char tty_path[32]={0}; sprintf(tty_path,"/dev/%s&qu ...

  6. java中getBytes方法可能使图片文件产生的问题

    InputStream is = new FileInputStream(fl); ImageInputStream iis = ImageIO.createImageInputStream(is); ...

  7. 匹配img和a

    a:<\s*a\shref=*([^>]*)>([^<]|<(?!/a))*<\s*/a\s*> img:<img\b[^<>]*?\bsr ...

  8. 如何编写Angular指令

    [20140917]Angular:如何编写一个指令 *:first-child { margin-top: 0 !important; } body>*:last-child { margin ...

  9. 在Eclipse中进行HotSpot的源码调试--转

    原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...

  10. Android上的事件流操作数据库

    最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在Android端实现一个. 根据文章的介绍,将每次数据的变更事件,像是插入,删除或者更新等,记为一个不可变的事件,让数 ...