Java之完全链式编程

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"
        }
    ]
}

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值