写点什么

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

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

关注

评论

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

聊聊Serverless

kimmking

CDN百科 | 最近,你的APP崩了吗?

阿里云Edge Plus

CDN

CDN百科 | 假如没有CDN,网络世界会变成什么样?

阿里云Edge Plus

奔向 10W+ 的第一次 update

赵新龙

InfoQ B站 Quora

一杯茶的时间,上手 Git 团队协作开发

图雀社区

git GitHub

由丰巢快递柜引发的思考

Neco.W

创业 思考 丰巢

谈谈控制感(2):怎么让我们更健康

史方远

个人成长 心理

Kafka系列第6篇:消息是如何在服务端存储与读取的,你真的知道吗?

z小赵

Java 大数据 kafka 实时计算

读懂才会用 : 瞅瞅Redis的epoll模型

小眼睛聊技术

redis 缓存 学习 开源 架构 后端

一文看懂开源工作流引擎 Flowable

八味阁

Java spring 开源 企业中台 工作流

CDN云课堂 | EdgeRoutine技术专家教你把JS代码跑到CDN边缘

阿里云Edge Plus

Java CDN edge

《Linux就该这么学》笔记(二)

编程随想曲

Linux

可视化 Tekton 组件 Tekton Dashboard

郭旭东

Kubernetes cicd

多个 SSH keys 的配置,方便 Git 对不同仓库的使用与管理

与光

git GitHub SSH

KubeFATE:在Kubernetes上部署联邦学习平台

亨利笔记

人工智能 学习 FATE KUBEFATE

视达荣登ChinaBang Awards 2020智慧零售榜Top10

极客编

想退休,可能没机会了

池建强

读书感悟

并发编程如何才能不再头疼:iOS中的协程

超越杨超越

ios 协程 coobjc ucontext

我站在愚蠢之巅

escray

学习 CSD 认证实战营

用SpreadJS实现在线Excel的录入与展示,提升企业医保信息化服务水平

葡萄城技术团队

SpreadJS 医保信息化 在线excel

概念有时候很坑

伯薇

抽象 思考力 沟通 概念

用测试驱动开发学算法

escray

学习 CSD 认证实战营

GrowingIO 微服务 SaaS 与私有部署运行实践

GrowingIO技术专栏

大数据 微服务 SaaS

TOTO 2020再次荣获iF、红点两项国际设计大奖

极客编

抄作业

escray

学习 CSD 认证实战营

DD 测试linux性能

HU

Java 编程基础

michaelliu

游戏夜读 | 如何优化缓冲加载?

game1night

如何推动与影响中型前端团队的成长

堂主

研发管理 大前端 团队建设

MySQL数据类型DECIMAL用法

Simon

MySQL

CDN云课堂 |可编程CDN – EdgeScript应用场景、语言速览和实操演示

阿里云Edge Plus

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