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

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

关注

评论

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

深度解析:利用1688 API获取商品详情的全面指南

Noah

NineData和华为云在一起!

NineData

数据库 DevOps 华为云 NineData GuassDB

基于Vue+thinkPhP6前后端分离的多客陪玩管理系统100%原生源码/技术培训/运维协助/开发文档齐全/官方终身授权/全球搭建部署/支持二次开发

DUOKE七七

制造业包括哪些?需要堡垒机吗?

行云管家

网络安全 信息安全 堡垒机 制造业

AI Agent 开发者对话:科研和商业化落地

奇绩创坛

人工智能 创业 AI 大模型 agent

软件测试学习笔记丨JUnit5标记测试用例

测试人

软件测试 测试开发

python中对于wordcloud词云生成报错提示的解决

我再BUG界嘎嘎乱杀

Python wordcloud 词云

突破Web3红海,DePIN如何构建创新生态系统?

TechubNews

web3、

在 Go 语言中如何让结构体不可比较?

伤感汤姆布利柏

HDC 2024 | 华为云云原生开源+OpenHarmony,加速开发者应用创新

华为云开源

开发者 云原生 华为开发者大会 华为云开源

草莓不是莓,西瓜才是莓——解读 Kubernetes 中被驱逐的 Pod

小猿姐

Kubernetes 云原生

软件测试学习笔记丨JUnit5重复测试

测试人

软件测试

惊艳!老司机熬夜总结的Python高性能编程,高效、稳定、快速!

我再BUG界嘎嘎乱杀

Python 后端 高性能 开发语言

完美解决 WebSocket 连接失败的技巧

Liam

程序员 后端 websocket

2024 Intersolar Europe,这家中国能源新秀再次瞩目!

科技汇

交互式原型设计神器:Axure RP 9 for Mac/win版中文激活版

你的猪会飞吗

mac软件下载 苹果软件下载

GitHub星标破千Star!Python游戏编程的初学者指南

我再BUG界嘎嘎乱杀

Python 入门 开发语言 零基础 游戏编程

GPT-4o差点没及格!首个多任务长视频评测基准,它有亿点难

Openlab_cosmoplat

ChatGPT GPT-4 人工智能、

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