tansci-boot/magic-script-skill/references/lambda-async.md

2.6 KiB
Raw Blame History

Lambda表达式与异步调用

Lambda表达式

映射(map)

var list = [
    {sex : 0,name : '小明',age : 19},
    {sex : 1,name : '小花',age : 18}
];
var getAge = (age) => age > 18 ? '成人' : '未成年'
return list.map(item => {
    age : getAge(item.age),
    sex : item.sex == 0 ? '男' : '女',
    name : item.name
});
// 结果:[{sex: "男", name: "小明", age: "成人"}, {sex: "女", name: "小花", age: "未成年"}]

过滤(filter)

var list = [
    {sex : 0,name : '小明'},
    {sex : 1,name : '小花'}
]
return list.filter(item => item.sex == 0);
// 结果:[{sex: 0, name: "小明"}]

过滤+映射(filter + map)

var list = [
    {sex : 0,name : '小明'},
    {sex : 1,name : '小花'}
]
return list.filter(item => item.sex == 0).map(item => {
    sex : item.sex == 0 ? '男' : '女',
    name : item.name
});
// 结果:[{sex: "男", name: "小明"}]

分组(group)

默认聚合为List

var result = [
    { xxx : 1, yyy : 2, value : 11},
    { xxx : 1, yyy : 2, value : 22},
    { xxx : 2, yyy : 2, value : 33}
];

return result.group(item => item.xxx + '_' + item.yyy)
// 结果:{"1_2": [{...}, {...}], "2_2": [{...}]}

自定义聚合对象

return result.group(item => item.xxx + '_' + item.yyy,list => {
    count : list.size(),
    sum : list.map(v=>v.value).sum(),
    avg : list.map(v=>v.value).avg()
})
// 结果:{"1_2": {"avg": 16.5, "count": 2, "sum": 33}, "2_2": {"avg": 33, "count": 1, "sum": 33}}

关联(join)

var year2019 = [
    { "pt":2019, "item_code":"code_1", "sum_price":2234 },
    { "pt":2019, "item_code":"code_2", "sum_price":234 }
];
var year2018 = [
    { "pt":2018, "item_code":"code_1", "sum_price":1234.0 }
];
return year2019.join(year2018, (left, right) => left.item_code == right.item_code, (left, right) => {
   '年份' : left.pt,
   '编号' : left.item_code,
   '今年' : left.sum_price,
   '去年' : right == null ? 'unknow' : right.sum_price
});

异步调用

普通方法

// 使用async关键字会启动一个线程去执行返回Future
var user1 = async db.select("select * from sys_user where id = 1");
var user2 = async db.select("select * from sys_user where id = 2");
// 调用get方法表示阻塞等待获取结果
return [user1.get(),user2.get()];

lambda

var list = [];
for(index in range(1,10)){
    // 当异步中使用外部变量时,为了确保线程安全的变量,可以将其放在形参中
    list.add(async (index)=>db.select("select * from sys_user where id = #{index}"));
}
return list.map(item=>item.get());