AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

Java EE 7 推出 Expression Language 3

  • 2013-07-30
  • 本文字数:1300 字

    阅读完需:约 4 分钟

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 ;)关注我们,并与我们的编辑和其他读者朋友交流。

2013-07-30 03:533646
用户头像

发布了 256 篇内容, 共 94.5 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

谈谈低代码的安全问题,一文全给你解决喽

加入高科技仿生人

软件开发 低代码 信息安全 低代码开发

让Web和App无缝链接的移动深度链接方案

MobTech袤博科技

9000字,通俗易懂的讲解下Java注解

Java你猿哥

Java ssm 实战 Java工程师

测试策略与测试手段

测吧(北京)科技有限公司

测试

ChatGPT王炸更新!能联网获取新知识,可与5000+个应用交互,网友:太疯狂了

Openlab_cosmoplat

工业互联网 开源社区 智能制造 ChatGPT

分享:ODC 如何精准展现 SQL 执行的耗时?

OceanBase 数据库

数据库 oceanbase

熟悉的测试用例设计方法都有哪些?

测吧(北京)科技有限公司

测试

测试同学职场成长的关键要素

老张

团队管理 个人成长

Springboot 撞上 NebulaGraph——NGbatis 初体验

NebulaGraph

Java ORM 图数据库

LP流动性挖矿代币分红模式dapp系统开发原理

开发微hkkf5566

EasyExcel 带格式多线程导出百万数据

三十而立

Java 互联网 IT

自学黑客/网络渗透,一般人我劝你还是算了

网络安全学海

黑客 网络安全 安全 信息安全 渗透测试

注意!2023,你需要了解这些IT趋势

引迈信息

人工智能 程序员 网络安全 低代码

华秋电子受邀参加产业高峰论坛,探讨电子行业新商机

华秋电子

3D模型分割新方法解放双手!不用人工标注,只需一次训练,未标注类别也能识别|港大&字节

Openlab_cosmoplat

模型 开源社区

4.0 功能抢先看 | 读懂一个项目的研发效能 之 项目交付效率

思码逸研发效能

研发效能

数据采集&流批一体化处理使用指南

大河

批处理 ETL 流处理 bboss 流批一体化

集成化、小型化、大势所趋,模块电源优势明显

华秋电子

软件测试/测试开发丨app自动化测试之设备交互API详解

测试人

软件测试 自动化测试 测试开发 appium

为研发效能度量找到合适的参照系

思码逸研发效能

研发效能 效能度量

3 天交付新需求?极狐GitLab APP 「极限编程 XP」实践

极狐GitLab

DevOps 敏捷开发 CI/CD 极限编程 极狐GitLab

软件测试 | 白盒的测试方法

测吧(北京)科技有限公司

测试

软件测试 |全局变量和局部变量有什么区别?

测吧(北京)科技有限公司

测试

开源工具系列6:Grype

HummerCloud

裸辞底气!GitHub飙升“java面试笔记2023” 了解下八股文天花板

三十而立

Java 互联网 面试 IT java面试

EasyExcel 带格式多线程导出百万数据(亲测牛逼)

三十而立

Java 互联网 IT 程序猿

HarmonyOS 联合绿盟发布折叠屏软件规范,携HUAWEI Mate X3带来创新折叠体验

科技汇

Apache HugeGraph1.0.0 版本正式发布!

百度安全

对话数十位学术合作代表:如何提升前沿技术在商业领域的落地应用?

阿里技术

前沿技术

面试造火箭?GitHub飙升“2023(Java 岗)面试真题汇总”转载40万

三十而立

Java 互联网 IT java面试

软件缺陷是什么?

测吧(北京)科技有限公司

测试

Java EE 7推出Expression Language 3_Java_Dan Woods_InfoQ精选文章