Java之完全链式编程

2023-10-30

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java之完全链式编程 的相关文章

  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • Eclipse 自动完成更改变量名称

    只是一个愚蠢的问题 但很难搜索 因为有很多关于 Eclipse 自动完成的主题 而且很难找到与我的问题匹配的内容 所以问题是 如果我写 MyClass MyVarName 然后按空格键 添加 new MyClass Eclipse 自动添加
  • 我们如何测试我们的 Java UI?

    我们正在寻找记录和回放类型的测试工具来自动化我们的一些 UI 功能测试 我们已经研究了从 Silke 到 QTP 的大多数常见嫌疑 但没有一个起作用 当需要右键单击才能从右键单击菜单中选择某些内容时 或者当您必须在网格的下拉列表中选择一个值
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ASM之前看一下maxStack指令吗?

    我正在尝试使用 ASM 库将字节代码转换为不同的格式 这可以使用 MethodVisitor 来完成 就像这个简单的测试代码一样 return new MethodVisitor ASM7 Override public void visi
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • Spring 术语中命令、表单、业务和实体对象之间的区别?

    我试图理解这些对象在松散耦合系统方面的差异 业务对象与实体对象相同吗 我可以使用 MVC 中的业务或实体对象作为我的命令对象吗 命令对象与表单对象相同吗 只是寻找 Spring 术语和用法中对象类型的说明 我在 stackoverflow
  • 将 EditText 聚焦在设备上运行的 PopupWindow 中时出现异常

    我正在为 Android 开发一个弹出窗口 它正在工作 我在上面添加了一个 EditText 和一个按钮 当在 ADV 上运行时 它可以正常工作 而在设备上运行时 当我专注于 EditText 时 这会抛出一个奇怪的异常 android v
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • Akka 和 spring 配置

    我正在尝试将 akka 与 spring 结合起来 但没有成功 基本上 我的应用程序似乎不习惯读取 akka 模式 具有架构的 service context xml 的一部分
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • 链表中的虚拟节点

    问 什么时候使用它们 作业问题 列表中的第一个和最后一个节点 有时用作列表中的第一个和最后一个节点 从未用作列表中的第一个和最后一个节点 维基百科说 哨兵节点是与链接一起使用的专门指定的节点 列表和树作为遍历路径终止符 哨兵节点的作用是 不
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • Apache HttpClient TCP Keep-Alive(套接字保持活动)

    我的 http 请求需要太多时间才能被服务器处理 大约 5 分钟 由于连接闲置 5 分钟 代理服务器将关闭连接 我正在尝试在 Apache DefaultHttpClient 中使用 TCP Keep Alive 来使连接长时间处于活动状态
  • Apache Kafka 是否提供异步订阅回调 API?

    我的项目正在将 Apache Kafka 视为老化的基于 JMS 的消息传递方法的潜在替代品 为了让这个过渡尽可能的顺利 如果替代的排队系统 Kafka 有一个异步订阅机制那就更理想了 类似于我们当前项目使用的JMS机制MessageLis
  • Java 相当于 Python 的 urllib.urlencode(基于 HashMap 的 UrlEncode)

    From https stackoverflow com questions 2018026 should i use urllib or urllib2 2018103 2018103 Java 中 Python 的 urllib url
  • Python 可以替代 Java 小程序吗?

    除了制作用于物理模拟 如抛射运动 重力等 的教育性 Java 小程序之外 还有其他选择吗 如果你想让它在浏览器中运行 你可以使用PyJamas http pyjs org 这是一个 Python 到 Javascript 的编译器和工具集
  • 使用 Hibernate 防止无限循环数据检索

    我想知道 想象一个场景 例如 POJO public class User private String userName private String name private String surname private List

随机推荐

  • VS2022部署/安装 QT(以5.14.2为例)

    一 下载并安装Qt Visual Studio Tools 点击扩展 并选择管理扩展 二 搜索QT并下载Qt Visual Studio Tools 注意 如果wifi下载很慢 甚至不动 可以尝试用 热点 下载好后 关闭vs2022 它会自
  • Java基础 String StringBuffer StringBuilder的异同介绍

    一 String StringBuffer StringBuilder的对比 String StringBuffer StringBuilder 字符串类型 常量 不可变 变量 可变 变量 可变 线性安全 安全 final修饰 安全 方法s
  • 什么是PHP中的函数?它们如何使用?

    嘿 你好啊 PHP中的函数就像是一个超级有技能的工人 可以帮助我们更快更好地完成任务 它们就像是一个个工具箱 里面装满了各种用途的工具 函数可以执行各种任务 比如计算两个数的和 检查字符串是否包含某个字符 读取文件等等 使用函数可以让我们的
  • golang构造N叉树

    package main import fmt strconv sync type Spaninfo struct AppNames string json appNames ContainErr bool json containErr
  • STM32端口复用和重映射

    STM32的引脚可设置为可设置为 普通IO功能 复用功能 重映射功能 不过普通IO功能 复用功能用得比较多 复用 在TSM32里面 大部分的引脚都是有GPIO复用功能 也就是说 一个 GPIO如果可以复用为内置外设的功能引脚 那么当这个 G
  • Java使用POI导出Excel、合并单元格、插入网络图片

    假设存在这样一张表A audience 观众表 id zjhm name gender address 表B seat 座位表 表明这个观众主动坐过哪些座位 id 表C check 校核表 表明这个观众被系统管理人员校核过哪些座位 id 一
  • Python练习题——BNUZ

    python练习题 BNUZER 一 填空题 二 简答题 三 程序设计题 谏言 一 填空题 若world world 则print hello world 输出 helloworld 表达式 3 in 1 2 3 4 的值为 False 表
  • 基于Element-UI给Vue页面添加Loading效果

    基于Element UI给Vue页面添加Loading效果 1 引入 2 在标签里面添加v loading 3 在data中定义 4 调用后端接口之前设置true 返回数据画图后设置false 1 引入 import Loading fro
  • 如何搭建个人服务器(网站/游戏)?

    在现代这个互联网时代 不会建站就OUT啦 下面小编给大家分享一个最快捷的建站方法 用这个建站方法 不仅简单快速 而且不花一分钱 不用买域名 也不用买空间 尤其适合刚刚接触建站的新手 学建站的学生和想打造个人网页的朋友 准备工具 一台电脑 X
  • 轻量、便捷、高效—经纬恒润AETP助力车载以太网测试

    随着自动驾驶技术和智能座舱的不断发展 高宽带 高速率的数据通信对主干网提出了稳定 高效的传输要求 CAN FD LIN已无法充分满足汽车的通信需求 车载以太网作为一种快速且扩展性好的网络技术 已经逐步成为了汽车主干网的首选 此外 为了满足车
  • STM32CubeProgrammer V2.9.0版本 通过UART bootload下载STM32G030系列芯片有Bug

    文章目录 CubeProgrammerV2 9 0最新版本的Bug 友情提醒 CubeProgrammerV2 9 0最新版本的Bug 本人笔记本电脑最近新装系统 想着安装最先版本的Stm32CubeProgrammer软件试试 再使用Ua
  • Ubantu 系统下安装fasttext及重要函数

    因为最近遇到了一个文本向量化的问题 所以接触了很多fasttext这个工具 原理什么的就不讲 网上实在是太多了 但是我在实验的过程中遇到了很多的问题 其中绝大多数都是安装fasttext问题 我也看到了很多博主说是fasttext是在win
  • 性能测试——性能监控工具——ServerAgent的安装与使用

    一 下载 首先进入网址 http jmeter plugins org downloads all 下载资源 ServerAgent 2 2 1 zip JMeterPlugins Standard 1 3 1 zip JMeterPlug
  • 如何在Go中编写多行字符串?

    本文翻译自 How do you write multiline strings in Go Does Go have anything similar to Python s multiline strings Go是否与Python的多
  • 网页粒子背景插件 -Canvas-nest.js

    地址 https github com hustcc canvas nest js 如果以上的js有问题 直接点击下面的下载 canvas nest js下载地址 https cdn bootcss com canvas nest js 1
  • terminator配置ICer自用

    bashrc Source global definitions if f etc bashrc then etc bashrc fi Uncomment the following line if you don t like syste
  • PADS Layout制板文件和贴片文件的输出方法

    1 综述 制板文件输出到板厂进行PCB制板 贴片文件输出到贴片厂进行PCBA Printed Circuit Board Assembly 制造 在完成PCB的布局布线工作后 需要输出制板文件到板厂进行制作PCB 再将PCB裸板和电子物料或
  • Python数据处理案例

    关于数据处理案例有两个 第一个案例是我整理到有道云上的 就直接剪切下来了 下面直接进入正题 案例1 快餐数据 案例2 欧洲杯数据 先进行数据探索 data info data describe 查看数据集是否有缺失值且哪个字段存在缺失值 可
  • 无法启动计算机中丢失HAL.dll,Win7系统提示“hal.dll损坏或丢失”导致windows无法启动怎么办...

    win7系统电脑经常弹出提示 hal dll损坏或丢失 导致windows无法启动 怎么回事呢 导致win7 64位系统提示 hal dll损坏或丢失 的原因有很多种 那么该怎么处理呢 其实解决的方法也很简单 接下去系统城小编向大家介绍Wi
  • Java之完全链式编程

    Java8的Stream操作方式实在令人心驰神往 不需要注释就能看懂的链式操作 十分简约和雅观 但是在实际编码过程中对于非集合操作是无法做到链式操作的 于是就有了一下操作 虽然功能还不够全面 但是先开源出来 有了更好的操作也请大家遵循开源精