Spring表达式语言(SPEL)学习(02)
构造数组
/**
* 数组生成
*/
@Test
public void test5(){
int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue();
int[][] numbers2 = (int[][]) parser.parseExpression("new int[4][5]").getValue();
// 一维数组可以初始化
int[] numbers3 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue();
Assert.assertTrue(numbers3.length==3);
// 二维数组初始化失败
int[][] numbers4 = (int[][]) parser.parseExpression("new int[][]{{1,2,3},{4,5,6}}").getValue();
}
如果需要构造一个空数组,则可以直接new一个空的数组,多维数组也是支持的,但是多维数组只支持一个空的数组,对于需要初始化指定数组元素的定时暂时在SPEL中是不支持的
构造List
在SPEL中可以使用{e1,e2,e3}的形式来构造一个List
@Test
public void test09() {
ExpressionParser parser = new SpelExpressionParser();
List<Integer> intList = (List<Integer>)parser.parseExpression("{1,2,3,4,5,6}").getValue();
int index = 0;
for (Integer i : intList) {
Assert.assertTrue(i == ++index);
}
}
如果希望构造的List的元素还是一个List,则可以将构造的List的元素定义为{e1,e2,e3}这样的形式,如:{{1,2},{3,4,5},{6,7,8,9}}
@Test
public void test09_1() {
ExpressionParser parser = new SpelExpressionParser();
List<List<Integer>> list = (List<List<Integer>>)parser.parseExpression("{{1,2},{3,4,5},{6,7,8,9}}").getValue();
int index = 0;
for (List<Integer> intList : list) {
for (Integer i : intList) {
Assert.assertTrue(i == ++index);
}
}
}
构造Map
在SPEL中如果需要构造一个Map则可以使用{key1:value1,key2:value2}的形式进行定义
@Test
public void test10() {
ExpressionParser parser = new SpelExpressionParser();
Map<String, Long> map = (Map<String, Long>)parser.parseExpression("{'key1':1L,'key2':2L}").getValue();
Assert.assertTrue(map.get("key1").equals(1L));
Assert.assertTrue(map.get("key2").equals(2L));
}
如果需要构造一个空的Map,则只需指定对应的表达式为{:}即可
@Test
public void test10_1() {
ExpressionParser parser = new SpelExpressionParser();
Map<String, Long> map = (Map<String, Long>)parser.parseExpression("{:}").getValue();
Assert.assertTrue(map.isEmpty());
}
元素访问
1.在SPEL中可以通过索引的形式访问List或Array的某一个元素,对应的索引是从0开始的,以list[index]的形式出现
@Test
public void test08_1() {
Object user = new Object() {
public List<String> getInterests() {
List<String> interests = Arrays.asList(new String[] {"BasketBall", "FootBall"});
return interests;
}
};
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("interests[0]").getValue(user, String.class).equals("BasketBall"));
Assert.assertTrue(parser.parseExpression("interests[1]").getValue(user, String.class).equals("FootBall"));
}
@Test
public void test08_2() {
Object user = new Object() {
public String[] getInterests() {
return new String[] {"BasketBall", "FootBall"};
}
};
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("interests[0]").getValue(user, String.class).equals("BasketBall"));
Assert.assertTrue(parser.parseExpression("interests[1]").getValue(user, String.class).equals("FootBall"));
}
2.对于Map而言,则是通过类似于map[key]的形式访问对应的元素的
@Test
public void test08_3() {
Object user = new Object() {
public Map<String, String> getInterests() {
Map<String, String> interests = new HashMap<String, String>();
interests.put("key1", "BasketBall");
interests.put("key2", "FootBall");
return interests;
}
};
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("interests['key1']").getValue(user, String.class).equals("BasketBall"));
Assert.assertTrue(parser.parseExpression("interests['key2']").getValue(user, String.class).equals("FootBall"));
}
集合选择
SPEL允许将集合中的某些元素选出组成一个新的集合进行返回,语法是collection.[符号][selectionExpression],selectionExpression中直接使用的属性、方法等都是针对于集合中的元素来的
- collection.?[selectionExpression]:从集合按条件筛选生成新集合
- collection.^[selectionExpression]:从集合按条件筛选取第一个元素
- collection.$[selectionExpression]:从集合按条件筛选取最后一个元素
@Test
public void test12_1() {
Object user = new Object() {
public List<String> getInterests() {
List<String> interests = new ArrayList<String>();
interests.add("BasketBall");
interests.add("FootBall");
interests.add("Movie");
return interests;
}
};
ExpressionParser parser = new SpelExpressionParser();
List<String> interests = (List<String>)parser.parseExpression("interests.?[endsWith('Ball')]").getValue(user);
Assert.assertTrue(interests.size() == 2);
Assert.assertTrue(interests.get(0).equals("BasketBall"));
Assert.assertTrue(interests.get(1).equals("FootBall"));
}
@Test
public void test12_2() {
Object user = new Object() {
public Map<String, String> getInterests() {
Map<String, String> interests = new HashMap<String, String>();
interests.put("key1", "BasketBall");
interests.put("key2", "FootBall");
interests.put("key3", "Movie");
return interests;
}
};
ExpressionParser parser = new SpelExpressionParser();
Map<String, String> interests = (Map<String, String>)parser.parseExpression("interests.?[value.endsWith('Ball')]").getValue(user);
Assert.assertTrue(interests.size() == 2);
Assert.assertTrue(interests.get("key1").equals("BasketBall"));
Assert.assertTrue(interests.get("key2").equals("FootBall"));
}
集合投影
将集合中每个元素的某部分内容组成一个新的集合进行返回,语法是collection.![projectionExpression],projectionExpression中直接使用的属性和方法都是针对于collection中的每个元素而言的
@Test
public void test13_1() {
Object user = new Object() {
public List<String> getInterests() {
List<String> interests = new ArrayList<String>();
interests.add("BasketBall");
interests.add("FootBall");
interests.add("Movie");
return interests;
}
};
ExpressionParser parser = new SpelExpressionParser();
List<Boolean> interests = (List<Boolean>)parser.parseExpression("interests.![endsWith('Ball')]").getValue(user);
Assert.assertTrue(interests.size() == 3);
Assert.assertTrue(interests.get(0).equals(true));
Assert.assertTrue(interests.get(1).equals(true));
Assert.assertTrue(interests.get(2).equals(false));
}
@Test
public void test13_2() {
Object user = new Object() {
public Map<String, String> getInterests() {
Map<String, String> interests = new HashMap<String, String>();
interests.put("key1", "BasketBall");
interests.put("key2", "FootBall");
interests.put("key3", "Movie");
return interests;
}
};
ExpressionParser parser = new SpelExpressionParser();
List<String> interests = (List<String>)parser.parseExpression("interests.![value]").getValue(user);
Assert.assertTrue(interests.size() == 3);
for (String interest : interests) {
Assert.assertTrue(interest.equals("BasketBall") || interest.equals("FootBall") || interest.equals("Movie"));
}
}
自动扩充
在构建SpelExpressionParser时我们可以将其传递一个SpelParserConfiguration对象以对SpelExpressionParser进行配置
- 参数1:在遇到List或Array为null时是否自动new一个对应的实例
- 参数2:在List或Array中对应索引超过了当前索引的最大值时是否自动进行扩充
class User {
public List<String> interests;
}
@Test
public void test() {
User user = new User();
SpelParserConfiguration parserConfig = new SpelParserConfiguration(true, true);
ExpressionParser parser = new SpelExpressionParser(parserConfig);
//第一次为null
Assert.assertNull(parser.parseExpression("interests").getValue(user));
//自动new一个List的实例,对应ArrayList,并自动new String()添加6次。
Assert.assertTrue(parser.parseExpression("interests[5]").getValue(user).equals(""));
//size为6
Assert.assertTrue(parser.parseExpression("interests.size()").getValue(user).equals(6));
}
Spring表达式语言(SPEL)学习(02)的更多相关文章
- Spring学习笔记--Spring表达式语言SpEL
Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...
- Spring表达式语言SpEL
Spring表达式语言,简称SpEL,是一个支持运行时查询和操作对象图的强大的表达式语言.语法类似于EL:SpEL使用#{…}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean属 ...
- Spring表达式语言SpEL简单介绍
Spring3引入了Spring表达式语言(Spring Expression Language,SpEL). SpEL有非常多特性.比較经常使用的包含: 1.使用bean的id来引用bean, 以下 ...
- Spring3表达式语言(SpEL)学习笔记
最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...
- Spring表达式语言:SpEl
概念: 是一个支持运行时查询和操作的对象图的强大的表达式语言. 语法类似于EL:SpEl使用#{ ...}作为定界符,所有在大括号中的 字符都将被认为是SpEl SpEl为bean的属性进行动态赋值提 ...
- Sping表达式语言--SpEL
Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean ...
- Spring ——表达式语言 Spring Expression Language (转载)
目录 SpEL简介与功能特性 一.为什么需要Spring表达式语言 二.SpEL表达式Hello World! 三.SpEL表达式 3.1.文字表达式 3.2.SPEL语言特性 3.2.1.属性 3. ...
- Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)
5.1 概述 5.1.1 概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ...
- 开涛spring3(5.1&5.2) - Spring表达式语言 之 5.1 概述 5.2 SpEL基础
5.1 概述 5.1.1 概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行 ...
- 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)
7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...
随机推荐
- NOI Linux 食用指北
写这篇 blog 的原因是某个小朋友要考 CSP 了还不会用 linux,怎么回事呢. 单击图片即可放大. 前置- linux 虚拟机的安装 在官网 / 其他地方下载 VMware. 在 noi 官网 ...
- [Python] 利用python的第三方库xlrd和xlwt来处理excel数据
今天在处理excel表格的时候,有一个需要提取表格中部分数据的操作.如果人工操作的话,有将近几千行,这样重复操作劳民伤财. 所以python就派上用场了. 简单介绍一下我要处理的问题,在excel一列 ...
- k8s Rabbitmq安装部署
安装方式 kubectl apply -f rabbitmq.yaml -n yunda-dev-cache rabbitmq.yaml ##创建PV # 注意更换存储方式 --- apiVersio ...
- shell脚本之规范与变量
shell编程规范与变量 名词简述 面向过程语言 按照顺序执行程序 第一件事干什么->第二件事干什么......(C,shell...) 面向对象语言 把程序看成一个整体(java,python ...
- Java IO教程- Java文件
创建文件 我们可以从中创建一个 File 对象 路径名 父路径名和子路径名 URI(统一资源标识符) 我们可以使用File类的以下构造函数之一创建一个文件: File(String pathname) ...
- Ynoi 题目总结:
Preview: 因为是关于 \(\text{Ynoi}\) 的题目总结,所以自然也要像 \(\text{Ynoi}\) 一样来一段长长的开头. 这是一个蒟蒻的告白 高一上半学期,嘻嘻哈哈的糊弄过去了 ...
- 基于JuiceFS 的低成本 Elasticsearch 云上备份存储
杭州火石创造是国内专注于产业大数据的数据智能服务商,为了解决数据存储及高效服务客户需求,选择了 Elasticsearch 搜索引擎进行云上存储.基于性能和成本的考虑,在阿里云选择用本地 SSD EC ...
- Android 11 后的应用数据和文件
Android应用数据的保存方式有四种,分别是应用专属存储空间.共享存储.偏好设置.数据库. 应用专属存储空间 应用专属存储空间:存放应用专属文件,主要包括两个空间,卸载后移除 内部存储空间:位于系统 ...
- 掌握这些,轻松管理BusyBox:如何交叉编译和集成BusyBox
在嵌入式系统中,由于设备的资源限制,需要开发人员寻找一种轻量.小型且使用广泛的工具集.而 BusyBox 就是这样一个在嵌入式系统中非常实用的工具集.本文将介绍如何在 Ubuntu 22.04 平台上 ...
- Detecting Unknown Encrypted Malicious Traffic in Real Time via Flow Interaction Graph Analysis
1 前言 1.1 标题 Detecting Unknown Encrypted Malicious Traffic in Real Time via Flow Interaction Graph An ...