飞天发布时刻:2024年 Forrester 公有云平台Wave™评估报告解读 了解详情
写点什么

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:533496
用户头像

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

关注

评论

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

深入理解JVM运行机制与GC机制

做梦都在改BUG

Java JVM 虚拟机 GC

快速玩转 CNStack 2.0 流量防护

阿里巴巴云原生

阿里云 云原生 CNStack

2023年“开放原子校源行”项目正式启动,腾讯大力支持开源人才培养

科技热闻

Higress 0.7.0 版本发布:GA 进入倒计时

阿里巴巴云原生

阿里云 云原生 Higress

数智时代的来临,养老行业接入人工智能技术已是势不可挡

加入高科技仿生人

人工智能 AI 养老服务 养老

FastAPI 的路由介绍与使用

宇宙之一粟

Python FastApi 路由

AI自然语言处理的过去和未来

鲸品堂

自然语言处理 ChatGPT 企业号 4 月 PK 榜

三思光电入选浙江省2023数字化生产制造示范项目名单!

电子信息发烧客

MySQL多版本并发控制MVCC实现原理

做梦都在改BUG

Java MySQL 数据库 MVCC

三次迭代终放“大招”,Themis Pro版即将问世

西柚子

龙蜥社区 3 月度运营大事件回顾

OpenAnolis小助手

活动 生态 龙蜥社区 运营月报 重要事件

HTTP与HTTPS的区别

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

测试

新思科技:车联网产业的起点是安全

InfoQ_434670063458

车联网 新思科技 汽车安全

Spring MVC 之 HttpMessageConverter

做梦都在改BUG

Java spring Spring MVC

软件测试/测试开发丨必知必会的Docker 命令

测试人

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

阿里秀MySQL高端玩法,300页MySQL调优文档GitHub开源即巅峰

做梦都在改BUG

Java MySQL 数据库

愿我们心中都有信念,眼里都有光芒

禅道项目管理

团队管理 项目管理 敏捷开发

三次迭代终放“大招”,Themis Pro版即将问世

小哈区块

小程序SDK的发展趋势与未来展望

FinFish

小程序 APP开发 小程序容器 超级app

关于编译的重要概念总结

timerring

编译器

海尔牵头!又一国家重点研发计划启动!

Openlab_cosmoplat

人工智能 开源项目 开源社区

LeaRun低代码开发平台 赋能企业快速落地BI大屏

力软低代码开发平台

【转载】亚信科技亮相中国高速公路信息化大会,与云南云通数联达成战略合作

亚信AntDB数据库

AntDB AntDB数据库 企业号 4 月 PK 榜

阿里云EMAS移动测试最佳实践|马来西亚第一大电子钱包通过EMAS测试提效6倍

移动研发平台EMAS

云计算 阿里云 移动研发平台 移动测试

各界伙伴畅谈展望,OpenCloudOS发布首个全自研版本

科技热闻

软件测试/测试开发丨必知必会的Docker 命令

测试人

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

GitHub开源大厂缓存架构Redis优化的文档,900页全是干货

做梦都在改BUG

Java 数据库 redis 缓存

Selenium Grid作用是什么?Selenium Grid的使用过程?

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

测试

北京国家会计学院聂兴凯:用友BIP事项会计助力企业迈入智能会计时代

用友BIP

智能会计 价值财务

软件测试/测试开发丨应用打包还是测试团队老大难问题?

测试人

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

博睿数据中海油多云资源监控与治理案例荣膺云数大会年度优秀实践案例

博睿数据

可观测性 智能运维 博睿数据 精选案例

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