BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Java EE 7推出Expression Language 3

| 作者 Dan Woods 关注 1 他的粉丝 ,译者 马德奎 关注 0 他的粉丝 发布于 2013年7月31日. 估计阅读时间: 5 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

Java EE 7对Java表达式语言API进行了大幅度的调整,该API即Expression Language 3。根据JSR-341,EL API的增强包括对lambda表达式的支持、静态字段和方法访问、集合处理和独立处理器模式等。

在Java EE 7之前,Java表达式语言是JavaServer Faces和JavaServer Pages API的紧耦合组件。JSR-341将Java表达式语言当作独立实体,从Java EE的视图层API中解耦出来,但仍然保持其互操作性。

现在,EL API给了开发人员调用特定Java EL的能力。创建一个新引入的ELProcessor类实例,并用一个表示可计算脚本的字符串作为参数,调用它的eval方法,返回结果可以在Java应用的作用域内用作一个变量。

ELProcessor el = new ELProcessor();
assert ((Integer)el.eval("a = [1, 2, 3]; a[1]")) == 2;

除了上述独立模式,JSR-341还给予Java EE开发人员编写lambda表达式的能力。Lambda表达式已被列入明年的Java 8标准版,但当前EL开发人员只能在他们的脚本中使用lambda语法。在去年的JavaOne大会上,JSR-341规范的领导者Kin-man Chung就曾指出,为了确保API的通用性和将来Java EL与Java 8的互操作性,制定规范的专家组咨询了大量Java 8项目的Lambda开发人员。

ELProcessor el = new ELProcessor();
assert ((Integer)(el.eval("((x,y) -> x+y)(4, 5)"))) == 9;

为了处理集合,新的Java EL流API包括forEach、reduce、filter和map等操作符。Java EL集合处理中引入的许多特性和概念也计划整合到Java中,并作为Java 8的一部分。但是,从现在开始,延迟和预加载流以及lambda表达式作为JSR-341功能增强一部分,开发人员就能从中获益。

ELProcessor el = new ELProcessor();
List list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
    list.add(i);
}
el.defineBean("list", list);
List processedList = (List)el.eval("list.stream().filter( x -> x <= 3).map(x -> x * 5)
.toList()");
assert processedList.get(0) == list.get(0);
assert processedList.get(1) == list.get(5);
assert processedList.get(2) == list.get(10);
assert processedList.get(3) == list.get(15);

此外,JSR-341还实现了一个期待已久的对Java EL的增强,它使开发人员可以直接访问静态字段和方法。默认情况下,java.lang.*类会被预加载到所有的脚本中,但是,使用ELProcessor实例的ELManager之后,EL脚本开发人员可以直接使用这些加载到EL上下文的类的静态内容。

ELProcessor el = new ELProcessor();
el.getELManager().importStatic("com.company.Class.STATIC_FIELD");
assert (el.eval("Math.random()") instanceof Double);
System.out.println(el.eval("STATIC_FIELD"));

JSR-341对Java表达式语言的增强,将和新引入的独立处理器模式一起,成为JSP和JSF实现的强大助手。

参考英文原文:Java EE 7 Delivers Expression Language Enhancements


感谢马国耀对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ;)或者腾讯微博(@InfoQ;)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT