opipe--一款基于java的自定义“命令”管道
opipe是一个“命令”管道,其设计思路与linux的命令管道一致。不同的是,linux的命令管道串联了一组命令,命令间是以输入、输出流串联在一起的。而opipe实际为一个操作(函数)的管道,操作间以返回值及调用参数的方式串联在一起,即opipe会用前一个操作的返回值作为输入参数调用后一个操作,并重复这样的调度直到整个管道中的所有操作都执行完成。opipe是由短语operation pipe变化而来。其中operation在opipe中被表示为一个函数形式;多个operation用符号”|”进行串联构成一个管道,格式如下:
“operation1 | operation2 | ……”
operation实现时采用了moql的Function技术,每个operation其实就是一个Function。但由于Function技术只接受EntityMap类型的参数,故opipe方法重新定义了一个接口operation,该接口可以接受一个Object类型的参数,这样方便使用者根据需要去扩展operation的实现。但需要注意的是,使用者需要确保管道中的operation的返回值能够成功作为下一个operation的调用参数。
public interface Operation {Object operate(Object in);
}
opipe中有两种采用了moql Function技术的概念。一种是operation;一种是function。operation实现了Operation接口,能够通过管道符串接为一个调用管道;而function不能进行串联,它被视为一种opipe能力的有效补充。因为function实现的返回值没有特定的约束,所以它有更广泛的应用环境,它可以在operation中被嵌套调用,如:对某个operation的输入参数进行特殊的预处理等。如下:
assignment(ipAndPort, strFormat('%s:%s', ip, port))
assignment是一个operation,而strFormat是一个function。
下面是关于opipe的一个完整的示例:
String s = "2019-10-26 192.1.32.4:8081";
String pipeline ="regParse('data','(?<time>[^\\s]+)\\s(?<ip>[^:]+):(?<port>\\d+)') "
- "| assignment(ipAndPort, strFormat('%s:%s', ip, port)) "
- "| printOut(strFormat('%s %s', ipAndPort, time))";
try {Opipe opipe = OpipeBuilder.createOpipe(pipeline);EntityMap entityMap = new EntityMapImpl();entityMap.putEntity("data", s);opipe.operate(entityMap);
} catch (MoqlException e) {e.printStackTrace();
}
在例子中regParse、assignment以及printOut三个operation被串接为一个管道。regParse的功能为将输入的字符串按照正则表达式的描述捕获为一个EntityMap;示例中该EntityMap内包含4个键值对,它们的key分别为time、ip、port及data。assignment为赋值操作,参数1为待赋值变量的名字,参数2为值,赋值完成后,它们将作为一个键值对写入输入的EntityMap中并返回;strFormat为字符串格式化函数(参见:JDK关于String.format的相关说明)。示例中assignment执行后EntitMap中会多出一个名为ipAndPort,值为192.1.32.4:8081的键值对。printOut为一个打印输出操作,它将输入的对象打印输出到控制台。示例最后的输出为“192.1.32.4:8081 2019-10-26”。
opipe项目只提供了几个简单的操作实现,主要是为了方便开发者理解这个设计思路。开发者可以在理解后,根据自己的应用需要去扩展operation或function。并可通过调用OpipeBuilder的registFunction注册自己的operation或function。
opipe的项目路径:https://github.com/colorknight/opipe
opipe--一款基于java的自定义“命令”管道相关推荐
- QQRobot一款基于Java的娱乐qq机器人
QQRobot一款基于Java的娱乐qq机器人 git地址:https://gitee.com/tysong1/QQRobot/tree/master AD:上QQ群214580864购买服务器享优惠 ...
- JAVA套料程序_Nest4J是一款基于Java作为开发语言的Nest算法包
Nest4J Nest4J是一款基于Java作为开发语言的Nest算法包.可以看做一款能在服务端进行运行计算的Nest算法库. 基于SVGNest进行了Java化的改造. 同样这也作为了我本科的毕业设 ...
- java 幻影_幻影(Phantom)消息平台,是一款基于Java实现的即时通讯(IM)系统
Phantom-Platform 介绍 幻影(Phantom)消息平台,是一款基于Java实现的即时通讯(IM)系统. 提供支持单聊.群聊.SDK等通用的技术通讯组件,开箱即用. 软件架构 构建 项目 ...
- H2:一款基于 Java 的嵌入式关系型数据库
文章目录 H2 简介 下载安装 执行 SQL 语句 查看帮助 运行 SQL 脚本 生成 DDL 语句 断开数据库连接 连接模式 命令行客户端 Maven 依赖 资源文档 总结 大家好,我是只谈技术不剪 ...
- 一款基于 Java 的可视化 HTTP API 接口开发神器
今天推荐的 5 个项目是: magic-api :一款基于 Java 的可视化 HTTP API 接口开发神器. LanguageTool : 一款基于 Java 语言编写的开源语言校正工具. toB ...
- 一款基于ExoPlayer的自定义播放器(已开源)
一.基于ExoPlayer 自定义播放器 JPlayer支持功能: 1 ExoUserPlayer 基本播放. 2 GestureVideoPlayer 增加手势 亮度,音量,快进,等手势. 3 Ma ...
- 基于java调用adb命令安卓shell里面Read-only file system 问题解决
当我们在安卓内部使用shell命令的时候会出现Read-only file system 我是root权限但是还是不行.如何解决? 1|rk3368_box:/system/app $ cp -f / ...
- 一款基于java的超级棒的开源支付系统(用来毕设也不错),国内首款开源的互联网支付系统
最近年初刚开始了,小编想着应该会有很多公司开始冲一波今年的业绩,既然是冲业绩,就离不开我们的支付系统,所以小编就去网上给大家找到了一款超级棒的开源支付系统!帮助大家从头到尾了解清楚这其中的逻辑! 所以 ...
- 基于java语言轻量级实时风控引擎
介绍: radar是一款基于java语言,使用Springboot + Mongodb + Groovy + Es等框架搭建的轻量级实时风控引擎,适用于反欺诈应用场景,极简的配置,真正做到了开箱即用. ...
最新文章
- 尹伊:我眼中的Datawhale
- php自动轮播图代码,JavaScript如何实现动态轮播图效果?(代码示例)
- python如何打开文件编辑界面_Python-PyQt5-图形可视化界面(5)--打开文件或文件夹--QFileDialog...
- eclipse - unresolved inclusion: stdio.h
- 为什么要设置Java环境变量(详解)
- 网络软文发布软件_星浪中合网软文写出爆款汽车营销软文的特点是什么?
- 罗格斯大学电子与计算机系排名,罗格斯大学美国大学排名及专业排名汇总(USNEWS美国大学排名版)...
- 关于数组方面的算法分析
- css a4纸_一把刀、一张2毛钱的纸,刻出的动物太逼真,一幅卖上千美元
- # 2017-2018-1 20155224 《信息安全系系统设计基础》第四周MyOD
- 2015蓝桥杯C++A:牌型种数(分配问题)
- Java+jquery+jsonp实现跨域
- 大白话聊聊Java并发面试问题之谈谈你对AQS的理解?
- Quartz配置文件quartz.properties加载
- python为什么被称为胶水语言_为什么Python被称为“胶水语言”?
- 上班划水,给男朋友做个数字炸弹游戏
- NULL, '\0',0 '0'的区别
- 基于STC89C51单片机,CH340芯片的下载电路
- JavaEE项目实战_流程审批之二
- spring cloud alibaba整合sentinel
热门文章
- [C#-Util]-读写文件汉字乱码
- 如何增加虚拟机ubuntu的硬盘
- Tensorflow(r1.4)API--tf.nn.max_pool
- 《高质量C/C++编程指南》学习笔记
- python 多线程 异步_python 多线程异步
- defender 报备_微软Defender获AV-TEST杀软评测最高分
- springboot主线程_springboot中的多线程.md
- ios 数字键盘左下角添加按钮_ios数字键盘添加完成按钮
- python程序设计常见运算符号_python常用运算符
- python json操作_Python读取JSON数据操作实例解析