发布在即!企业 AIGC 应用程度测评,3 步定制专属评估报告。抢首批测评权益>>> 了解详情
写点什么

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

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

关注

评论

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

链上衍生品协议 ProsperEx:探索 RWA 叙事,打造 DeFi 变异黑马

股市老人

通俗易懂数仓建模—Inmon范式建模与Kimball维度建模

五分钟学大数据

大数据 数据仓库 维度建模

磁盘阵列(RAID)是什么?RAID有什么好处?

百度搜索:蓝易云

Linux 阿里云 云服务器 硬盘 阿里云、

走向 Native 化:Spring&Dubbo AOT 技术示例与原理讲解

阿里巴巴云原生

spring 阿里云 云原生 dubbo native

一文搞懂常见的加密算法 | 社区征文

海风极客

网络 加密算法 年中技术盘点

Docker学习路线1:介绍

小万哥

Docker 程序员 容器 后端 开发

暗黑2能用Java开发?还能生成APP?

烧霞

游戏开发 java17

从钢铁行业数字化管控平台的智能进化,看超自动化能力边界

王吉伟频道

RPA 数字化转型 超自动化 业务流程自动化 钢铁行业

开心档之Web Quality - 无障碍(WAI)

雪奈椰子

毕马威:中国算力关联产业规模可达24万亿元|报告

B Impact

C++的list-map链表与映射表

攻城狮Wayne

一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

西柚子

一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

小哈区块

一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

威廉META

克服困难、提升学习效率的关键方法

叶小鍵

开心档之Web 品质 - 国际化

雪奈椰子

从多元生态、开源到人才培养,让开发者成为决定性力量

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 7 月 PK 榜

基于云原生网关的全链路灰度实践

阿里巴巴云原生

阿里云 微服务 云原生

IoTOS-v1.2.1接入J-IM(t-io)后台通知App

IoTOS

物联网平台 IoT 开源物联网 国产开源 开源项目介绍

2023-07-09:给定N、M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种颜色都使用了,叫一种有效方法。 求一共有多少种有效方法。 1 <= N,

福大大架构师每日一题

福大大架构师每日一题

数据增强之裁剪、翻转与旋转

timerring

人工智能

BFF网关模式开发指南

WizInfo

数据交换不失控:华为云EDS,让你的数据你做主

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 7 月 PK 榜

华为云河图KooMap:夯实数字孪生底座,点燃燎原星火

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 7 月 PK 榜

代码随想录 Day11 - 栈与队列(中)

jjn0703

Linux升级命令yum upgrade和yum update,有什么区别?

百度搜索:蓝易云

云计算 Linux 服务器 云服务器 服务器租用

微服务之服务器缓存

Disaster

微服务

深度剖析线上应用节点流量隔离技术

阿里巴巴云原生

阿里云 云原生 流量隔离

IoTOS-App(移动端) v0.1.0 免费开源 | 商用

IoTOS

物联网平台 IoT 开源物联网 国产开源 开源项目介绍

一文熟知网络 – 文章巨长,但是很详细

邹志全

网络编程 计算机网络 架构设计

【实用教程】Linux系统Windows系统硬盘扩容教程

百度搜索:蓝易云

Linux 运维 服务器 云服务器 服务器租用

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