Java8的Stream操作方式实在令人心驰神往,不需要注释就能看懂的链式操作,十分简约和雅观。但是在实际编码过程中对于非集合操作是无法做到链式操作的。于是就有了一下操作,虽然功能还不够全面,但是先开源出来,有了更好的操作也请大家遵循开源精神,一起合作探讨。
目录
第一步:创建Chain类,这个是所有操作的主体,相当于集合中的Steam
第二步:测试,所有的业务逻辑都将在一条链上完成。如有其他操作,可以自行扩展Chain类。
-
第一步:创建Chain类,这个是所有操作的主体,相当于集合中的Steam
package com.longshine.clearancepay.commons.chain;
import java.util.HashMap;
import java.util.function.Function;
/**
* 链式编程主体
* 说明:为了实现用代码来解释代码。不需要多余的注释,特此建立此类。每一个程序以Chain.start启动,期间调用相应的操作即可。
*
* @author sunziwen
* @version 1.0
* @date 2019/6/13 9:59
**/
public class Chain {
/**
* 数据基本存储容器(这里需要泛型处理),因为java是静态语言,这里有很大的局限性!,换成python将会十分完美。
*/
private HashMap<String, Object> container;
/**
* 链式编程起始点
*
* @return Chain
*/
public static Chain start() {
Chain chain = new Chain();
//初始化容器
chain.container = new HashMap<>(2);
return chain;
}
/**
* 链式编程终点,输出最终结果
*
* @return Chain
*/
public Object end(Function<HashMap<String, Object>, Object> function) {
return function.apply(container);
}
/**
* 校验(必须返回true,否则抛异常,输出默认提示)
*
* @return Chain
*/
public Chain must(Function<HashMap<String, Object>, Boolean> function) {
if (!function.apply(container)) {
throw new RuntimeException("校验未通过");
}
return this;
}
/**
* 校验(必须返回true,否则抛异常,输出相应的提示)
*
* @return Chain
*/
public Chain must(Function<HashMap<String, Object>, Boolean> function, String message) {
if (!function.apply(container)) {
throw new RuntimeException(message);
}
return this;
}
/**
* 访问数据库
*
* @return Chain
*/
public Chain mysql(Function<HashMap<String, Object>, Object> function) {
container.put("mysql", function.apply(container));
return this;
}
/**
* 访问redis
*
* @return Chain
*/
public Chain redis(Function<HashMap<String, Object>, Object> function) {
container.put("redis", function.apply(container));
return this;
}
}
-
第二步:测试,所有的业务逻辑都将在一条链上完成。如有其他操作,可以自行扩展Chain类。
package com.longshine.foreach.controller;
import com.longshine.clearancepay.commons.chain.Chain;
import com.longshine.clearancepay.commons.msg.AjaxResult;
import com.longshine.foreach.service.ChainService;
import com.longshine.thymeleaf.controller.Person;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Comparator;
import static java.util.stream.Collectors.toList;
/**
* 链式编程测试控制器
*
* @author sunziwen
* @version 1.0
* @date 2019/6/13 11:00
**/
@RestController
@RequestMapping("chain")
public class ChainController {
@Resource
private ChainService chainService;
@PostMapping("students")
public Object getStudents(@RequestBody Person person) {
return Chain.start()
.must(x -> "Lily".equals(person.getName()))
.must(x -> person.getAge() >= 16, "请输入正确的年龄")
.mysql(x -> chainService.getDate(person).stream()
.sorted(Comparator.comparing(Student::getName))
.skip(3)
.limit(3)
.collect(toList()))
.redis(x -> null)
.end(x -> x.get("mysql"));
}
}
第三步:测试结果
{
"code": 100000,
"success": true,
"msg": "ok",
"data": [
{
"name": "QfplP2wi",
"age": 4736,
"address": "LBUx7",
"school": "a"
},
{
"name": "U96S7SOG7",
"age": 9351,
"address": "P47m",
"school": "7VGs"
},
{
"name": "Xl",
"age": 7730,
"address": "47gl",
"school": "keO"
}
]
}