2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

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

关注

评论

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

企业云上安全办公,就用华为云桌面

爱科技的水月

设计企业如何降低设备成本?来试试华为云桌面吧!

爱科技的水月

智能勘探 | AIRIOT智慧油田管理解决方案

AIRIOT

物联网 智慧油田

2022年了,苹果还不能长截图,华为的指关节截屏了解一下~

极客天地

3ds Max云渲染平台哪个好?

Renderbus瑞云渲染农场

云渲染 3dsMax云渲染平台哪个好

华为云桌面,数字化时代便捷、安全的办公选择

清欢科技

华为云大数据BI解决方案,助力企业实现数字化转型

科技说

为什么 APISIX Ingress 是比 Traefik 更好的选择?

API7.ai 技术团队

云原生 APISIX Ingress Controller Kubernetes Serverless

基于Netty的IM聊天加密技术学习:一文理清常见的加密概念、术语等

JackJiang

Netty 即时通讯 即时通讯IM SSL/TLS

2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为3的数组,叫做达标数组。 返回达标数组的

福大大架构师每日一题

算法 rust 福大大

Spring-Mybatis整合

@下一站

程序设计 mybatis 12月日更 12月月更 springboot整合

色彩精准、数据安全,华为云上的超高清设计师云工作站给你新体验

爱科技的水月

库存积压营销差?不妨尝试华为云大数据BI

科技说

用户红利终结,应用分发如何实现“全链路加速增长”?

最新动态

绿色高效办公,华为云桌面不可或缺

爱科技的水月

法国名酒贾斯特里尼&布鲁克斯,俘获皇室贵族的葡萄酒

联营汇聚

华为云桌面的安全,到底是怎么做到的?

清欢科技

华为云桌面携手伙伴共建繁荣生态

清欢科技

从全球顶级数据库大会 SIGMOD 看数据库发展趋势

NebulaGraph

数据库 图数据库 技术演变

认证鉴权对于 API 网关的重要性

API7.ai 技术团队

认证授权 API Gateway APISIX 网关

教你用JavaScript实现鼠标特效

小院里的霍大侠

JavaScript 编程开发 初学者 入门实战

华为云大数据BI,助力企业挖掘信息数据潜在价值

科技说

Go Ubuntu 安装 gvm:Go 版本管理工具

非晓为骁

Go ubuntu 版本管理工具 gvm

当 Amazon Lambda 遇上 Apache APISIX 可以擦出什么火花?

API7.ai 技术团队

微服务 AWS API Gateway APISIX 网关

华为云桌面,助力企业灵活、高效办公

清欢科技

未来智安XDR荣膺ISC 2022创新能力百强

未来智安XDR SEC

Android基础入门教程

芯动大师

android Android开发

实测 | 海纳百川,华为OceanStor Pacific分布式存储为多元算力应用带来更优选择

脑极体

贾斯特里尼&布鲁克斯葡萄酒,绿色酿酒传承百年

联营汇聚

数据也能开口说话?这次汇报,老板疯狂给我点赞

图灵社区

数据分析 可视化 图表

数据也能开口说话?这次汇报,老板疯狂给我点赞

图灵教育

数据分析 可视化 图表

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