写点什么

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

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

关注

评论

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

Kurator v0.5.0发布,打造统一的多集群备份与存储体验

EquatorCoco

云计算 k8s 多集群

Eclipse、IntelliJ IDEA、PyCharm三种IDE的区别

小魏写代码

电商API接口的大数据分析与挖掘技巧

Noah

天天crud?试试这个低代码框架

互联网工科生

软件开发 低代码 crud 增删改查 JNPF

Topaz Video AI视频修复软件 for mac 4.1.0破解版

iMac小白

Cognizant 与 Microsoft 合作推出了新一代人工智能创新助手

财见

用精准分析揭示代币真实价值

Footprint Analytics

区块链 加密货币 代币

探索Flask接口路由技术:构建灵活可拓展的Python应用

测试人

Python flask 软件测试 自动化测试 测试开发

美国科技 5 巨头,研发狂烧 2020 亿刀!亚马逊 732 亿全球第一丨 RTE 开发者日报 Vol.127

声网

第36期 | GPTSecurity周报

云起无垠

让 K8s 更简单!8款你不得不知的 AI 工具

不在线第一只蜗牛

人工智能 AI Kubernetes 人工智能技术

2023Q3浪潮信息存储装机容量连续11季度稳居全球前三

财见

JNPF低代码引擎到底是什么?

高端章鱼哥

低代码 JNPF 本地部署

一文了解密码/国密及应用,密码也卡脖子?

快乐非自愿限量之名

前端 网络安全 信息安全 密码

美国服务器带宽指南:快速、稳定、高效的秘诀

一只扑棱蛾子

美国服务器

小程序容器是什么?或许帮你轻松解决移动应用开发难题

Geek_2305a8

关于软件定制开发,你关心的问题都在这里了

SoFlu软件机器人

软件定制开发 软件开发定制

一次非典型的gitlab镜像库(registry服务)故障排除

大伟

推荐一个副业,认真做真的很不错

Dominic

某客《微信小程序》从基础到实战视频教程

Geek_2e2feb

微信小程序 微信

Java Chassis 3技术解密:多种序列化方式支持

华为云PaaS服务小智

Java 华为云

Databend 开源周报第 128 期

Databend

Data Center

初次上手接触ArkTs

华为云开发者联盟

开发 华为云 华为云开发者联盟 ArtTs

百度面试,跪了!凉经分享

王磊

Java 面试题

HashData湖仓一体方案:方案概览与Hive数据同步

酷克数据HashData

【人民日报】“黄埔星”大模型发布!第三届粤港澳大湾区(黄埔)国际算法算例大赛启动

ModelWhale

人工智能 算法 大模型 竞赛 粤港澳大湾区

AI赋能代码生成,FuncGPT(慧函数)解放开发者生产力

SoFlu软件机器人

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