164 lines
3.7 KiB
Markdown
164 lines
3.7 KiB
Markdown
# 脚本语法详解
|
||
|
||
## for循环
|
||
|
||
### 循环集合
|
||
```javascript
|
||
var list = [1,2,3];
|
||
for(index,item in list){ //如果不需要index,也可以写成for(item in list)
|
||
println(index + ":" + item);
|
||
}
|
||
// 结果:0:1, 1:2, 2:3
|
||
```
|
||
|
||
### 循环指定次数
|
||
```javascript
|
||
var sum = 0;
|
||
for(value in range(0,100)){ //包括0包括100
|
||
sum = sum + value; //不支持+= -= *= /= ++ -- 这种运算
|
||
}
|
||
return sum; // 5050
|
||
```
|
||
|
||
## while循环
|
||
```javascript
|
||
var count = 100;
|
||
var sum = 0;
|
||
while(count){
|
||
sum = sum + count;
|
||
count = count - 1;
|
||
}
|
||
return sum; // 5050
|
||
```
|
||
|
||
## 循环map
|
||
```javascript
|
||
var map = {
|
||
key1 : 123,
|
||
key2 : 456
|
||
};
|
||
for(key,value in map){ //如果不需要key,也可以写成for(value in map)
|
||
println(key + ":" + value);
|
||
}
|
||
// 结果:key1:123, key2:456
|
||
```
|
||
|
||
## Import导入
|
||
|
||
### 导入Java类
|
||
```javascript
|
||
import 'java.lang.System' as System;
|
||
import 'javax.sql.DataSource' as ds;
|
||
import 'org.apache.commons.lang3.StringUtils' as string;
|
||
import 'java.text.*' // 此写法跟Java一致
|
||
|
||
System.out.println('调用System打印');
|
||
System.out.println(ds);
|
||
System.out.println(string.isBlank(''));
|
||
System.out.println(new SimpleDateFormat('yyyy-MM-dd').format(new Date()));
|
||
```
|
||
|
||
### 导入已定义的模块
|
||
```javascript
|
||
import log; //导入log模块,并定义一个与模块名相同的变量名
|
||
//import log as logger; //导入log模块,并赋值给变量 logger
|
||
log.info('Hello {}','Magic API!')
|
||
```
|
||
|
||
## new创建对象
|
||
```javascript
|
||
import 'java.util.Date' as Date;//创建之前先导包,不支持.*的操作
|
||
return new Date();
|
||
```
|
||
|
||
## 异步调用
|
||
|
||
### 异步调用方法
|
||
```javascript
|
||
var val = async db.select('.....'); // 异步调用,返回Future类型
|
||
return val.get(); //调用Future的get方法
|
||
```
|
||
|
||
### 异步调用lambda
|
||
```javascript
|
||
var list = [];
|
||
for(index in range(1,10)){
|
||
list.add(async (index)=>db.selectInt('select #{index}'));
|
||
}
|
||
return list.map(item=>item.get()); // 循环获取结果
|
||
```
|
||
|
||
## exit
|
||
语法格式为 `exit expr[,expr][,expr]....`
|
||
|
||
在`magic-api`中只取前三个值,分别对应`code`、`message`、`data`
|
||
|
||
如:`exit 400,'参数填写有误'`
|
||
|
||
## assert
|
||
语法格式为 `assert expr : expr[,expr][,expr]....`
|
||
|
||
如:`assert a == 1 : 400, 'a的值应为1'` 相当于
|
||
```javascript
|
||
if(a != 1){
|
||
exit 400, 'a的值应为1'
|
||
}
|
||
```
|
||
|
||
## 类型转换
|
||
通过`::`进行类型转换,如`xxx::int`、`xxx::double`等,当前支持转换类型有`int`、`double`、`long`、`byte`、`short`、`float`、`date`
|
||
|
||
```javascript
|
||
var a = "1";
|
||
return {
|
||
v1: a::int,
|
||
v2: a::int(0), //转换失败时,值为0
|
||
v3: "2020-01-01"::date('yyyy-MM-dd') //转为Date
|
||
}
|
||
```
|
||
|
||
`::sql`支持将数据转换为对应的sql类型,比如:
|
||
```javascript
|
||
img::sql('blob')
|
||
```
|
||
可传入的参数请参考`java.sql.Types`中定义的常量,不区分大小写。
|
||
|
||
## 嵌入其它脚本语言
|
||
```javascript
|
||
var name = "hello";
|
||
var test = ```javascript
|
||
name + ' ~ world'
|
||
```;
|
||
return test();
|
||
```
|
||
|
||
## 可选链操作符
|
||
可选链操作符(`?.`)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。
|
||
|
||
```javascript
|
||
var a = null;
|
||
var b = a?.name; // b = null;
|
||
var c = a?.getName(); // c = null;
|
||
```
|
||
|
||
## 扩展运算符
|
||
扩展运算符,又叫展开语法(Spread syntax),是用于将list或map在语法层面展开
|
||
|
||
### lambda 调用
|
||
```javascript
|
||
var sum = (a,b,c) => a + b + c;
|
||
System.out.println(sum(...[1,2,3])) // 结果:6
|
||
```
|
||
|
||
### list 展开
|
||
```javascript
|
||
var arr = [3,4,5];
|
||
System.out.println([1,2,...arr,6,7]) // 结果:[1, 2, 3, 4, 5, 6, 7]
|
||
```
|
||
|
||
### map 展开
|
||
```javascript
|
||
var map = {key2:2}
|
||
System.out.println({key1:1,...map,key3:3}) // 结果:{key1=1, key2=2, key3=3}
|
||
```
|