50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

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

关注

评论

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

2021年数据泄露成本报告解读

SEAL安全

DevSecOps 数据安全 混合云 零信任 软件供应链

基于Java的插件化集成项目实践

阿提说说

微服务 插件化

中小微企业如何简单便捷、低成本实现数字化?360视觉云有妙招

ToB行业头条

酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式

StarRocks

CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统

华为云开发者联盟

IoT 华为云 冷链

秀到飞起!Alibaba全新出品JDK源码学习指南(终极版)限时开源

Java全栈架构师

程序员 程序人生 jdk源码 Java 面试 架构师

关于 Intel 在 micro-vm 快速启动的探索及实例演示 | 第 36-38 期

OpenAnolis小助手

云原生 cpu 开源社区 sig 龙蜥大讲堂

开源一夏 |我在滴滴做开源

石臻臻的杂货铺

开源 8月月更

豆瓣评分9.0,“Linux命令行”经典巨著升级版上市了!

图灵教育

带你了解什么是 Web3.0

liuzhen007

Web 3.0

详谈RDMA技术原理和三种实现方式

C++后台开发

网络协议 C/C++后台开发 C/C++开发 RDMA技术 以太网

高效的组织信息共享知识库是一种宝贵的资源

Geek_da0866

「一篇终结JVM」:Java面试必问十个JVM核心知识点梳理

Java全栈架构师

Java 程序员 面试 程序人生 JVM

融云「音视频架构实践」技术专场【内含完整PPT】

融云 RongCloud

音视频技术

国内首发可视化智能调优平台,小龙带你玩转KeenTune UI

OpenAnolis小助手

开源 龙蜥社区 sig KeenTune 一键式性能调优

如何避免无效的沟通

观测云

从零开始搭建MySQL主从复制架构

杨杰灵

Java MySQL 主从复制

视频人脸识别和图片人脸识别的关系

夏夜许游

人脸识别 视频人脸识别

绝无此例!用实例演示如何使用Spring搭建微服务框架

Java永远的神

spring 面试 微服务 springboot SpringCloud

完整的搭建内网穿透ngrok详细教程(有图有真相)

Geek_32c728

签约计划第三季

基于云ModelArts的PPO算法玩“超级马里奥兄弟”【华为云至简致远】

科技怪咖

可复现、开放科研、跨学科合作:数据驱动下的科研趋势及应用方案

ModelWhale

数据分析 代码复现 开放生态 协同软件 科研成果

【技术白皮书】第一章:OCR智能文字识别新发展——深度学习的文本信息抽取

合合技术团队

自然语言处理 深度学习 AI OCR 信息抽取

面试不再被吊打!这才是Redis分布式锁的七种方案的正确打开方式

程序员小毕

Java 架构 面试 分布式 分布式锁

浅谈Service Mesh对业务系统的价值

HelloGeek

微服务 云原生 server mesh 微服务治理

华为ECS云服务器上安装Docker及部署Redis详细教程【华为云至简致远】

科技怪咖

出海季,互联网出海锦囊之本地化

融云 RongCloud

元宇宙 IT业界

不可忽略!户外LED显示屏的特点及优势

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

基于DMS的数仓智能运维服务,知多少?

华为云开发者联盟

数据库 后端 监控 智能运维

为何微博又双叒叕崩溃了?

华仔

ICDAR比赛技术分享

之家技术

算法 人工只能 竞赛 ICDAR

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