深入浅出java 8 lambda表达式--零基础一分钟入门
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表达式--零基础一分钟入门的更多相关文章
- 深入浅出 Java 8 Lambda 表达式
摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...
- 转载:深入浅出 Java 8 Lambda 表达式
原文地址:http://viralpatel.net/blogs/Lambda-expressions-java-tutorial/ OneAPM for Java 能够深入到所有 Java 应用内部 ...
- 函数:lambda表达式 - 零基础入门学习Python021
函数:lambda表达式 让编程改变世界 Change the world by program lambda表达式 Python允许使用lambda关键字来创建匿名函数.我们提到一个新的关键字:匿名 ...
- 零基础一分钟入门Python
这篇文章面向所有想学python的小伙伴(甚至你从没听过编程),这篇文章将会带你以最快的速度入门python.赶快上车,时间来不及了... 一,下载和安装python 1.下载: 1.1 python ...
- Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...
- Java 8 Lambda 表达式详解
一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...
- Java 8 Lambda表达式
Java 8 Lambda表达式探险 http://www.cnblogs.com/feichexia/archive/2012/11/15/Java8_LambdaExpression.html 为 ...
- Java 8 Lambda表达式10个示例【存】
PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...
- Java 8 Lambda 表达式
Lambda 是啥玩意 简单来说,Lambda 就是一个匿名的方法,就这样,没啥特别的.它采用一种非常简洁的方式来定义方法.当你想传递可复用的方法片段时,匿名方法非常有用.例如,将一个方法传递给另外一 ...
随机推荐
- Android Studio] Gradle项目中添加JNI生成文件(.so文件)
转:http://blog.csdn.net/qiujuer/article/details/24209457 为了适应潮流使用Android Studio还是有半年多了! 对于从Eclipse迁移项 ...
- easyui plugin——etreegrid:CRUD Treegrid
昨天写了一个ko+easyui的同样的实现,感觉写的太乱,用起来十分麻烦,于是今天照着edatagrid,写了一个etreegrid,这样再用ko绑定就方便多了. 使用很简单,$(tableId).e ...
- Java IO 之 InputStream源码
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- 导出 C/C++ API 给 Lua 使用[转]
导出 C/C++ API 给 Lua 使用 cocos2d-x 和 quick-cocos2d-x 的底层代码都是使用 C++ 语言开发的.为了使用 Lua 脚本语言进行开发,我们利用 tolua ...
- WinStore控件之TextBox
1 TextBox简单实例 内容摘要:包含文本的选中,弹出什么类型的键盘,回车隐藏键盘, <Grid Name="root" Background="Transpa ...
- 自己做的加速app测试流程的小工具,目前打算开放使用,想注册的朋友抓紧了,嘻嘻
为了加速小团队app的测试流程做了这个东西,www.xunce.net 主要特性: web: 一键上传app,方便随时下载 备注测试要点 添加附件,如checklist等文档 自动识别app版本,名 ...
- JS调用WebService
<html> <title>接口测试</title> <meta http-equiv="Content-Type" content=&q ...
- CLR via C#深解笔记七 - 自动内存管理(垃圾回收)
每个应用程序都要使用这样或者那样的资源,比如文件.内存缓冲区.屏幕空间.网络连接.数据库资源等.事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源. 要使用这些资源,必须为代表资源的类型 ...
- JS对象的几个方法介绍
1.hasOwnProperty 判断是不是对象自身的属性,如果是继承的返回false否则true function Fn(){ } Fn.prototype.num = 10; var obj = ...
- 2014 网选 5007 Post Robot(暴力或者AC_自动机(有点小题大作了))
//暴力,从每一行的开始处开始寻找要查询的字符 #include<iostream> #include<cstdio> #include<cstring> #inc ...