构造数组

/**
* 数组生成
*/
@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中直接使用的属性、方法等都是针对于集合中的元素来的

  1. collection.?[selectionExpression]:从集合按条件筛选生成新集合
  2. collection.^[selectionExpression]:从集合按条件筛选取第一个元素
  3. 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. 参数1:在遇到List或Array为null时是否自动new一个对应的实例
  2. 参数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)的更多相关文章

  1. Spring学习笔记--Spring表达式语言SpEL

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...

  2. Spring表达式语言SpEL

    Spring表达式语言,简称SpEL,是一个支持运行时查询和操作对象图的强大的表达式语言.语法类似于EL:SpEL使用#{…}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean属 ...

  3. Spring表达式语言SpEL简单介绍

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL). SpEL有非常多特性.比較经常使用的包含: 1.使用bean的id来引用bean, 以下 ...

  4. Spring3表达式语言(SpEL)学习笔记

    最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...

  5. Spring表达式语言:SpEl

    概念: 是一个支持运行时查询和操作的对象图的强大的表达式语言. 语法类似于EL:SpEl使用#{ ...}作为定界符,所有在大括号中的 字符都将被认为是SpEl SpEl为bean的属性进行动态赋值提 ...

  6. Sping表达式语言--SpEL

    Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean ...

  7. Spring ——表达式语言 Spring Expression Language (转载)

    目录 SpEL简介与功能特性 一.为什么需要Spring表达式语言 二.SpEL表达式Hello World! 三.SpEL表达式 3.1.文字表达式 3.2.SPEL语言特性 3.2.1.属性 3. ...

  8. Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)

    5.1  概述 5.1.1  概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ...

  9. 开涛spring3(5.1&5.2) - Spring表达式语言 之 5.1 概述 5.2 SpEL基础

    5.1  概述 5.1.1  概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行 ...

  10. 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)

    7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...

随机推荐

  1. Robert Kiraly Software Developer

    Robert KiralySoftware DeveloperCell Phone: 650-600-2520 Freenode: ##venturesSupports text messages P ...

  2. HBuilderX内置终端无法使用不能输入

    找到HBuilderX的目录打开plugins\builtincef3terminal\script找到main.js用记事本或其他什么打开他 把这部分代码替换成这个再重启hbuilderX就可以了 ...

  3. 安装OpenStack的yum源

    # yum install https://buildlogs.centos.org/centos/7/cloud/x86_64/openstack-liberty/centos-release-op ...

  4. CF580B

    题目简化和分析: 选择 \(n\) 个朋友,满足以下条件: 工资差异 \(<d\) 友谊和最大(题目翻译不太清楚) 现在面临两个问题 求差异值 求友谊和 所以我们理应想到线段树双指针. 排序后满 ...

  5. 如何用CRM销售管理系统实现销售目标?

    每个企业的销售业务都要制定目标计划,在制定销售计划时要考虑两个问题,一个是计划是否能够严格执行,另一个是计划是否可控,即明确销售目标后,合理分配时间,运用销售基本工作方法严格把控销售进度.那我们该如何 ...

  6. Windows下VC++编译器32位memcpy、memmove函数汇编代码详解

    整理者:赤勇玄心行天道 QQ号:280604597 微信号:qq280604597 QQ群:511046632 博客:www.cnblogs.com/gaoyaguo  blog.csdn.net/c ...

  7. pbootcms 后台内容列表搜索功能扩展及增加显示字段功能

    应项目要求,一个内容模型下栏目不宜分的层级过多,如新闻模块,分2022.2023.2024年度,每年度下分12个月,这样就是2层栏目,再依类别(科技.动漫.电影...)划分层级,栏目数量较多,而且不易 ...

  8. L2-030 冰岛人

    需要注意的地方: 我们只记录维京人的祖先,除了维京人的其他人不能记录它的祖先 #include <bits/stdc++.h> using namespace std; struct pe ...

  9. vscode设置将英文界面设置为中文?

    如果您希望将 Visual Studio Code(以下简称VSCode)的界面从英文设置为中文,可以按照以下步骤进行: 打开 VSCode 编辑器,并进入"扩展"菜单. 在搜索框 ...

  10. java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present

    完整的报错信息 java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present at ...