QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

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

关注

评论

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

区块链与物联网融合发展都会有哪些机遇与挑战

CECBC

区块链

哑面爽滑肤感胶浆

C13713145387

哑面爽滑肤感胶浆

Java中用户线程和守护线程区别这么大?

王磊

Java 并发编程 多线程 5月日更

Google官方关闭binary后,Android工程师怎么办?

Changing Lin

5月日更

模块三作业:消息队列详细设计文档

薛定谔的指南针

架构实战营

4.2 Go语言从入门到精通:延迟函数 defer

xcbeyond

defer Go 语言 5月日更

MySQL数据迁移那些事儿

Simon

MySQL 数据迁移

一次过透气浆、印一次透气浆

C13713145387

透气胶浆 一次过透气浆

夏季不塞网胶浆、夏季不堵网胶浆

C13713145387

夏季不塞网胶浆

架构实战营 模块二 作业

Pitt

架构实战营

自研消息队列架构设计文档

菠萝吹雪—Code

架构实战营

网络攻防学习笔记 Day5

穿过生命散发芬芳

5月日更 网络攻防

太简单了!这套Java异常处理的总结,80%的人都没看过

牛哄哄的java大师

Java

打破思维定式(二)

Changing Lin

5月日更

牛仔底色保护浆(喷砂工艺)

C13713145387

牛仔底色保护浆

Golang实现文件复制的技巧

liuzhen007

Go 语言 5月日更

进击的速溶咖啡:当中国AI开始玩工业化

脑极体

展开说说,Spring Bean IOC、AOP 循环依赖

小傅哥

Java spring 小傅哥 ioc 循环依赖

postgresql数据库 timescaledb 时序库 超级表 块的压缩(compress_chunk()的应用)

Yang

数据库 postgresql

采取有效云网络安全策略的5个基本步骤

云计算

爽面弹力胶浆、哑面弹力胶浆

C13713145387

爽面弹力胶浆

哑面防水尼龙胶浆Nylon printing paste

C13713145387

哑面防水尼龙胶浆

算法训练营 - 学习笔记 - 第五周

心在飞

入门到精通!阿里码农熬了2晚整理的Java工具,真香

飞飞JAva

Java java工具类

融云亮相 CDEC2021 上海站 全场景通信能力赋能企业数字升级

融云 RongCloud

Spring-技术专题-设计模式和研究分析

洛神灬殇

spring 设计模式 原理分析 5月日更

OAuth 2.0 与 OIDC

Zhang

OAuth 2.0 OIDC

超级全面的测试用例设计,你确定不来看一看?

程序员阿沐

软件测试 测试用例 测试工程师

数字资产的发行是全球都无法阻挡的大趋势!

CECBC

数字资产

建筑行业全周期区块链产融平台

CECBC

建筑行业

NumPy之:结构化数组详解

程序那些事

Python 数据分析 Numpy 程序那些事

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