JDK8 的 Lambda 表达式 -- 实现原理初探

JDK8 使用一行 Lambda 表达式可以代替先前用匿名类五六行代码所做的事情,那么它是怎么实现的呢?从所周知,匿名类会在编译的时候生成与宿主类带上 $1, $2 的类文件,如写在 TestLambda 中的匿名类产生成类文件是 TestLambda$1.class, TestLambda$2.class 等。

我试验了一下,如果使用的是 Lambda 表达式并不会生成额外的类文件,那么字节码里是什么样子的?来看下用  javap -c 反编译出下面文件产生的 TestLambda.class,两个方法,一个是  byAnonymousClass() 使用匿名类,另一个是 byLambda 使用 Lambda 的方式:

阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(994). 评论(0) »

JDK 8 的 Lambda 表达式 -- 写法

过去,我们使用匿名类的实现像  ActionListener 这样的接口,即使最简单的情景都需要写上五六行代码,这就显得有些累赘了。因为其实我们在 new ActionListener {} 时就是在创建一个 ActionListener 子类型,重载了方法,并初始化一个实例出来。现在我们手上有了 Lambda 表达式这一武器的话,就变得简单明了了,所以说  Lambda 是一种轻量级的实现机制。

这里是几个 Lambda 表达式的样子:

Lambda 的格式就是三部分:参数列表,-> 分隔符,执行体。其他语方的 Lambda 格式都这样的,可能就是分隔符不一样,如 Ruby 的 |,Scala 的 => 等。

执行体里的 return 只是标明返回到匿名方法的调用者,不是返回值的意思; 最上层是不能用 break 和 continue 关键字的,可用在循环中; 如果 Lambda 表达式有返回值,那么在每一条路径上都要有返回值或是抛出异常。路径上最后一条语句的返回值即为 Lambda 表达的返回值。 阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(380). 评论(0) »

JDK 8 的 Lambda 表达式 -- 应用背景

即将到来的 JDK8 最为引人入胜之处非 Lambda 表达式莫数了,这在其他动态语方,如 Ruby, Groovy, Scala 等语言中早已大行其道。一旦 JDK 搭上了 Lambda 这趟车,从此操作事件,线程,处理集合时又大为方便了。关于现阶段如何体验 JDK8 的特性可以参考 抢鲜设置 JDK8 的编程环境,印象

本文主要参考于官方的 State of the Lambda,并对源码或反编译出字节码,作一定的深入以助于各位理解,在 JVM 中是如何实现 Lambda 的。

Lambda 表达式,又称闭包(Closure),或称匿名方法(anonymous method)。这在其他语言中,如 Ruby, Groovy, Scala, JavaScript 等,甚至是在 C# 中运用得如火纯清的特性,JDK8 这才问候他,真有些晚了。没有 Lambda 时,Java 不得不求助于匿名类的回调方法来达到相似的目的,为了捕获外部变量,变量必须声明为 final。

一见到 Lambda,第一个反应就是 Lambda 表达式(局部而已),其实我们这里要说的 JDK8 的 Lambda 包含以下几块内容:

  1. Lambda 表达式,俗称闭包或匿名方法
  2. 方法和构造器引用
  3. 扩充的目标类型和更强的类型推断
  4. 接口中的默认静态方法

Lambda 这一特性使得 Java 也开始向函数式编程倾斜,关键是能更有效的应对并发环境。

说到 Lambda,我们不得不了解一下当前背景,例如下面一个典型的事件处理场景: 阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(596). 评论(0) »

JDK 7 代码中对捕获再抛出异常时的处理--即异常类型推断

JDK 发展过程中,第一次变化最大数 JDK1.5,加入了变长参数,泛型。泛型的最大的受益者是集合。JDK7 虽说引进了同时捕获多个异常(Multi-Catch),更聪明一点类型推断,资源的释放等,但我觉得变化还不大。接下来众人期望的 JDK8 的 Lambda 表达式才是激动人心的,恐怕这一特性的大赢家仍是集合。

这样 JDK 才不至于离 C# 太远,纯粹语言上讲,我更景仰 C#,比如它的匿名类型,更不论人家的 Lambda 了。

var person = new { Name = "Unmi", Website = "http://unmi.cc" };
Console.WriteLine(person.Name);

这要到 Scala 中才能见到这种影子。

注: JDK 从 1.5 起就加入了象 Chrome, Firefox 那样的版本党了,所以这个版本也叫做 JDK5,不管是后来的 JDK6, JDK7 等等,其实在命令行下 java -version 显示出来的也还是 1.5.0, 1.7.0_40 这种理智的版本号的。

回过神来,我们要说的是 JDK7 对异常的处理,不讲同时捕获多个异常和 try-with-resource 的处理,而要说的是捕获异常再次抛出时进步,这在某方面得益于 JDK7 类型推断。JDK7 类型推断对于泛型来说,它可以不用这么写 阅读全文 >>

类别: Java/JEE. 标签: . 阅读(1,107). 评论(0) »

Play Framework 2.1(Scala) 调用 WebService 返回 Response

在 Play Framework 2.1 中用 Scala 编程进行 WebService 调用想返回 Response,或 xml, json 结果时,初入可能会费些功夫,因为无论是 WS.url.get,或 post, put 方法返回的都是个 Future[Response] 对象,也就是如何从 Future[Response] 如何分离出 Response 对象的问题。

这里我们 map, 或 match/case 也可以取出其中 response 对象来,如果要作为结果返回还要用到 Await.result() 方法。

为了不把代码出现在摘在页面中,这里插点内容,像是拖延时间的战术。

如果你在使用 Play Framework 2 with Scala 时碰到这个错误:

Error: Cannot find an implicit ExecutionContext, either require one yourself or import ExecutionContext.Implicits.global

依照 899 号 Issue, 解决办法是你必须加上这个引入语句:

import play.api.libs.concurrent.execution.Implicits._

因为里面有我们需要用到的隐式的 global 吧。

下面是我用来请求 WebService 返回 Response 的代码: 阅读全文 >>

类别: PlayFramework. 标签: , . 阅读(1,864). 评论(0) »

抢鲜设置 JDK8 的编程环境,印象

和 JDK7 还没有热和,却开始关注 JDK8 起来了,JDK8 已进行到了 M8 开发预览版了,其中包含了一个千呼万唤的功能,即 Lambda 闭包的支持。在当前有对闭包特性的诉求,而 Java 本身不提供时,我们不得不转而求助于 JVM 上的其他的语言, 像 Scala, Groovy, JRuby 等。

不得不说 Scala 给我们带来了不少的快感,以致于想以更多的精力投入到 Scala 编程中去,不过还正在换取项目实践的机会。JDK8 引入 Lambda 后同样也是能更好的解决多核计算的问题,从程序员的角度来看,只要觉得 Lambda 能给我们带来无与伦比的灵活与便利性就足够了,水很深。

JDK8 还有增加的功能就是 JEP(JDK Enhancement-Proposal) 中的了。

来这里 http://openjdk.java.net/projects/jdk8/ 看看 JDK8 的里程碑

2012/04/26     M1     
2012/06/14     M2     
2012/08/02     M3     
2012/09/13     M4     
2012/11/29     M5     
2013/01/31     M6     
2013/06/13     M7     Feature Complete
2013/09/05     M8     Developer Preview 阅读全文 >>

类别: Java/JEE. 标签: . 阅读(3,647). 评论(0) »

35 个最好的 Ajax jQuery 自动完成插件,带例子

In this article,We are providing the best tutorials of Autocomplete in jQuery , ajax autocomplete and autosuggest with examples. jQuery Autocomplete an input field to enable users quickly finding and selecting some value, leveraging searching and filtering.In these days every body want fast and instant search,for this reason many popular search engines like google are using this feature ajax autocomplete.Combination of Php,ajax and jQuery autocomplete gives some extra feature to autosuggest.

1. Ajax AutoComplete for jQuery

Ajax Autocomplete for jQuery allows you to easily create autocomplete/autosuggest boxes for text input fields. Built with focus on performance – results for every query are cached and pulled from …
Ajax AutoComplete for jQuery

Read More Demo 阅读全文 >>

类别: Web/JS. 标签: , , . 阅读(1,144). 评论(0) »

Varnish 的安装使用,及简单配置

Varnish 是一个开源的反向代理软件,所以可做缓存服务器进行 Web 加速,类似的有 Squid, Nginx, 和  HAProxy。但 Varnish 与其他三个相比性能更优,例如 Squid 的成名是它可作为上网代理服务器, Nginx 是一个优秀 Web 服务器,这两都非专业的 Web 加速器,而 HAProxy 与  Varnish 有的一比。

实际上 Varnish 的表现如何了,网上找来找去都讲这么一个实证:挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。并且要知道 Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,牛人一个。

Varnish 有什么特点呢?

VCL 进行配置,正则表达式条件判定进行规则设置
支持负载均衡和健康检查,多种条件请求分分
支持 ESI( Edge Side Include),即页面局部组件的缓存
URL 地址重写,响应头改写 阅读全文 >>

类别: Linux/Unix. 标签: , . 阅读(1,424). 评论(0) »

由 TextMate 2 重回 TextMate 1.5.11, 附注册方法

我最爱在 Mac 下用 TextMate 了,2.0 后 TextMate 可免费使用了。在 http://macromates.com/download 上目前提供有 1.5.10, 1.5.11 和 2.o alpha。而且还开源了,见 https://github.com/textmate/textmate。但 2.0 之前的版本要用的话仍是需要注册,TextMate 2.0 还是自动更新的,可在 http://macromates.com/download,也可在 https://github.com/textmate/textmate/downloads 下载。

本来可以用  TextMate 2.0 挺好的,可是在 2.0 安装 Scala 的 Bundle 后,即使为它设置了 SCALA_HOME 仍是无法在 TextMate 中运行 Scala 程序,于是不得已为这个还得用 TextMate 1.5.11 了。

在此附上 Scala 和 Play2 的 Bundle 的下载安装方法:

$  git clone git://github.com/mads379/scala.tmbundle.git; open scala.tmbundle
$  git clone git://github.com/drewhjava/Play2.tmbundle.git; open Play2.tmbundle

使用 TextMate 是必须注册的,否则只能试用 30 天,从网上找来注册方法: 阅读全文 >>

类别: Linux/Unix. 标签: , . 阅读(2,430). 评论(2) »

XSLT 调用 Java 的类方法 -- Tomcat 环境

很早很久以前写过一篇 在 xslt 调用 java 方法的日志 XSLT 调用 Java 的类方法, 其中介绍是使用 org.apache.xalan.processor.TransformerFactoryImpl 实现的例子,JDK 本身就是用这个的。但是在 Tomcat 环境下,它有它自己的 XSLT 默认实现是 net.sf.saxon.TransformerFactoryImpl,这时候 XSLT 中的内容略有不同,而且显示更简便一些。

这么说吧, xalan 支持以下两种调用 java 方法的方式,而 saxon 只认得第二种

1. 声明到包,调用时带上类名

阅读全文 >>

类别: Java/JEE, XML/DOM. 标签: , . 阅读(328). 评论(0) »