# xingcore
**Repository Path**: SangonomiyaKokomi/xingcore
## Basic Information
- **Project Name**: xingcore
- **Description**: xingcore, XingCore, xinghe,意为“星核”,作为 Xing Java 系列工具库代码精华部分,作为后续 Xing Java工具库的基础、内核、依赖,也是后续 Java工具库的标准、规范。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-10-11
- **Last Updated**: 2025-10-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, java-util, java工具, xingcore, tools
## README
# XingCore **核心工具包**
## :book:相关介绍
**xingcore**, XingCore, xinghe,意为“星核”,作为 Xing Java 系列工具库代码精华部分,作为后续 Xing Java工具库的基础、内核、依赖,也是后续 Java工具库的标准、规范。
### :scroll:简介
是一个功能丰富且易用的 **Java工具库**,通过诸多实用工具类的使用,旨在帮助开发者快速、便捷地完成各类开发任务。
XingCore 包含一系列接口,基础实现,涵盖核心工具、加密、数据结构算法等多个领域。
这些封装包含了系列字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等一系列基础操作,还包含了 ACM数据结构算法,各种base接口,快速开发工具类(链式调用、逻辑建造),可以满足各种不同的开发需求。
### :golf:本包说明
本工具库遵从**面向接口**,所以接口可能分得特别细。
该 core 工具包将核心拆分应对不同使用情况,大大提高灵活性,未来sdk可能会依赖该sdk, 如 xingtools 等。
星天(xingtian)制作,基于 Java 8 向前兼容, 是一个整合各工具类的整合包。
## :bookmark:依赖使用
### :inbox_tray:安装教程
> 使用 Maven 导入依赖,选择下面一个方式
Maven 依赖 (全量版本)(会携带 Jackson 等系列包)
```xml
top.cutexingluo.core
xingcore-common-all
1.2.0
```
Maven 依赖(无额外依赖)
```xml
top.cutexingluo.core
xingcore-common
1.2.0
```
mini 版(去除 base-extra 包,精华版本)
Maven 依赖 (全量版本)(会携带 Jackson 等系列包)
```xml
top.cutexingluo.core
xingcore-mini-all
1.2.0
```
Maven 依赖(无额外依赖,最简版本,只含三个包)
```xml
top.cutexingluo.core
xingcore-mini
1.2.0
```
目前推荐使用的版本如下:
```txt
推荐使用最新版 v1.2.0
xingcore v1.2.0
```
xingcore 最低版本不能低于 v1.2.0
## :wrench:包含组件
| 模块 | 介绍 |
| ------------------- | ------------------------------------------------------------ |
| xingtools-base | 基础包,包含各种接口,枚举类等,不含任何实体类,做公用声明 |
| xingtools-base-impl | 基础实现包(依赖xingcore-base),包含各种接口的实现类,以及各种常用基础实体类、处理类 |
| xingtools-base-lib | 基础工具包(依赖xingcore-base-impl),包含各种常用工具类 |
| xingcore-base-extra | 扩展包(依赖xingcore-base-lib),包含各种扩展类,不常用类,以及不稳定工具(未来常变化) |
| | |
| xingcore-bom | bom包,用于管理依赖版本 |
| | |
| xingcore-mini | 含(base、base-impl、base-lib)三个基础包,无额外包 |
| xingcore-mini-all | 含(base、base-impl、base-lib)三个基础包,以及附加包 |
| xingcore-common | 含全部四个基础包,无额外包 |
| xingcore-common-all | 含全部四个基础包,以及附加包 |
当前版本组件之间的依赖关系如下:
xingtools-base <- xingtools-base-impl <- xingtools-base-lib <- xingcore-base-extra
## :apple:使用方式
### :lemon:使用讲解
根据类名意思了解该功能,好处是暂时不用查文档,并且和hutool互补,能够加快开发效率.
1. 可以通过`Util.`静态类的方式调出静态方法,一般由`XT`开头的类,例如`XTObjUtil`, `XTStrUtil` 等,以便直接调出类名、方法。
2. 通过 new 一个工具操作类 `Handler`等
3. 通过 of 等方式使用,例如 `new StreamChain()` 或 `StreamChain.of()`
## 🧰部分代表功能
### ⚙️ 工具类
#### 1.数据封装接口 (`IResultData`, `IResult`)
`IR`, `IResultData`, `IResult` 分别追加提供 getMsg, getCode, getData 方法
`IResultDataSource`, `IResultSource` 继续追加 setMsg, setCode, setData 方法
例如`IResultData`接口如下
```java
public interface IResultData extends IR {
T getCode();
}
```
可以根据面向接口实现方法,来满足异常常量、返回类、异常的统一。
```java
// 异常常量
@Getter
public enum EnumResult implements IResultData {
// 成功
SUCCESS(200, "操作成功");
private final int code;//状态码
private final String msg;//状态码对应的信息
}
// 异常
@Getter
public class ServerException extends RuntimeException implements IResultData{
private int code;
@Override
public String getMsg() {
return super.getMessage();
}
}
// 返回类
@Data
@Accessors(chain = true)
public class MyResult implements IResultSource {
private Integer code;
private String msg;
private T data;
// 面向接口
public static MyResult successBy(IResultData origin) {
MyResult result = new MyResult<>();
result.setCode(origin.getCode());
result.setMsg(origin.getMsg());
return result;
}
}
```
然后可以通过 ResultUtil 工具类进行封装返回值。
```java
// controller 示例
@RestController
@RequestMapping("/common")
public class CaptchaController {
...
@GetMapping("/captcha")
public MyResult> getCaptchaInfo() {
XX xx = testService.getXX();
// ResultUtil 工具类
return ResultUtil.selectFill(xx,
EnumResult.SUCCESS,
EnumResult.ERROR,
new MyResult<>());
// 默认策略(可以更改) 等同于下面
return captcha == null || Boolean.FALSE.equals(xx) ?
MyResult.errorBy(EnumResult.ERROR):
MyResult.successBy(EnumResult.SUCCESS).setData(xx);
}
}
```
在`1.0.3`版本提供了几个基础实现类
`CommonResult` (通用返回类)
`MSResult` (或 `R`), `Result`, `StrMSResult`, `StrResult` (code 为 `Integer`或 `String` , data 为 泛型 T或`Object` 的 四个组合)
`CommonResult` 类的基本属性如下:
```java
@Data
public class CommonResult implements IResultSource {
protected C code;
protected String msg;
protected T data;
}
```
**贯彻面向接口!**
#### 2.锁、异步(多线程)
锁提供基本的 LockHandler 类,以及下面的子类 XTLockHandler , XTExtLockHandler 等类。
下面是 LockHandler 的基本使用。
```java
@Test
void test() {
XTLockMeta lockMeta = new XTLockMeta(XTLockType.ReentrantLock); // 可重入锁
LockHandler lockHandler = new LockHandler(lockMeta);
lockHandler.init();
// Spring 的线程池
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.initialize();
// Runnable 接口
XTAsync.runAsync(() -> { // 继承 CompleteFuture 类,扩展了一些静态方法
lockHandler.lock(() -> {// Callable 接口
for (int i = 0; i < 20; i++) {
XTJUC.sleepMillis(100); // 目前仅两个线程方法,睡100ms
System.out.println(Thread.currentThread().getName() + "," + i);
}
return null; // 返回值
}, null);
}, executor);
XTAsync.runAsync(() -> {
lockHandler.lock(() -> {
for (int i = 0; i < 20; i++) {
XTJUC.sleepMillis(80);
System.out.println(Thread.currentThread().getName() + "," + i);
}
return null;
}, null);
}, executor);
XTJUC.sleepMillis(100_000);
}
```
#### 3.各种工具类
比如 `XTStrUtil` , `XTCollUtil` , `XTMapUtil` 等等扩展类,均是继承 hutool 包的对应工具类,可以直接使用目标类或扩展类。
各种需求示例
```java
// 替换 ${} 括号里的内容
XTPickUtil.putValueFromBraces("你们好! ${}, 你好!","XXX");
// 根据 value 删除 Map 的值
HashMap map = new HashMap<>();
XTMapUtil.deleteByValueWithStream(map, "hello world");
// 为 value 的 collection 添加数据
HashMap> map = new HashMap<>();
XTMapUtil.checkAddAll(hashMap1, "hello", ArrayList::new,
Arrays.asList("hello", "world"));
// 组合路径 xx/aa
XTPathUtil.combinePath("xx", "aa", XTPathUtil.UNIX_SEPARATOR);
XTPathUtil.combinePath("xx/", "/aa", XTPathUtil.UNIX_SEPARATOR);
// json 序列化
// Jackson 模拟 FastJson
JacksonSerializer serializer = new JacksonSerializer().initToFastJson();
String s = serializer.stringify(new XX());
// 仿 JS Apply, Call, Bind
new XTApply(PrintClass.class, "print", String.class).apply(target,"hello world");
new XTCall(PrintClass.class, "print", String.class).call(target,"hello world");
new XTBind("print", String.class).bind(target,"hello world");
// 扩展比较器 XTComparable, XTComparator, 可以比较 null
XTComparator c = new XTComparator(true); // 正序比较, 如果是在 sort 里面 , true -> null 值排最后, false -> null 排前面
c.tryCompareNull(null , 1);
// 反射工具 ClassMaker
ClassMaker cm = new ClassMaker(XX.class);
XX xx = cm.newInstanceNoExc(); // 静默实例化
// 未完待续
```
#### 4.高级建造工具(`BuilderMapChain`, `StreamChain`)
##### 1.HashMap扩展
为 HashMap 添加值
```java
void test() {
HashMap hashMap = new HashMap<>();
// 为 map 添加 key,value 对
int i = XTHashMap.putMapEntriesFromDValues(
hashMap,
"hello", 1,
"world", 2
);
System.out.println(hashMap); // {world=2, hello=1}
// 为 map 的 list value 补充值, check 代表不存在就 new 一个ArrayList填充进去
HashMap> hashMap1 = new HashMap<>();
XTMapUtil.checkAddAll(hashMap1, "hello", ArrayList::new,
Arrays.asList("hello", "world"));
XTMapUtil.checkAddAll(hashMap1, "hello", ArrayList::new,
Arrays.asList("hello1", "world1"));
System.out.println(hashMap1); // {hello=[hello, world, hello1, world1]}
}
```
##### 2.Optional 功能扩展类 StreamChain
StreamChain 包含 Optional 几乎所有方法,还对其进行了扩展
```java
void test() {
StreamChain chain = StreamChain.ofNullable(null)
.directMap(v -> v == null ? 2 : (int) v + 1);
System.out.println(chain); // StreamChain[2]
StreamChain streamChain = new ObjectStreamChain(1)
.cast(Integer.class)
.flatMap(StreamChain::ofNullable)
.map(v -> v + 1);
System.out.println(streamChain); // StreamChain[2]
ObjectStreamChain objectStreamChain = new ObjectStreamChain(2);
System.out.println(objectStreamChain);// StreamChain[2]
System.out.println(objectStreamChain.equals(streamChain)); // true
StreamChain opt = StreamChain.ofNullable(1);
List collect = opt.stream().collect(Collectors.toList());
Integer integer = opt
.flatMap(StreamChain::of)
.get();
System.out.println(integer); // 1
System.out.println(opt); // StreamChain[1]
System.out.println(collect); // [1]
}
```
##### 3.高级建造类 BuilderMapChain
生成一个建造树,如果当前层的值不存在,便可以从其他兄弟节点获取或生成,或者从父节点生成,直到得到值,返回。
```java
void test() {
BuilderMapChain chain = new BuilderMapChain(3, null, () -> {
// 第1层
return "第1层,";
}).withGetter(null, o -> {
// 第2层
String str = (String) o;
str += "第2层,";
return str;
}).withListGetter(null, Arrays.asList( // 第3层
(o) -> { // 从上1层获取数据
String str = (String) o;
str += "第3层-1,";
return str;
},
(o) -> { // 从上2层获取数据
String str = (String) o;
str += "第3层-2,";
return str;
}
));
// 下面三块是独立的,不在同一个方法内,因为创建便会填充数据(一次性对象)。
Entry entry = chain.createFrontDfs(3); // 前驱dfs创建3层
System.out.println(entry); // Entry [key=3, value=第1层,第2层,第3层-1,]
String s = chain.getValue(3); // 获取第3层数据
System.out.println(s); // 第1层,第2层,第3层-1,
Entry entry2 = chain.createBackBfs(2); // 后驱bfs创建2层
System.out.println(entry2); // Entry [key=1, value=第1层,第2层,]
String s2 = chain.getValue(2); // 获取第2层数据
System.out.println(s2); // 第1层,第2层,
Entry entry3 = chain.createBackDfs(3); // 后驱dfs创建3层
System.out.println(entry3); // Entry [key=2, value=第1层,第3层-2,]
String s3 = chain.getValue(3); //获取第3层数据
System.out.println(s3); // 第1层,第3层-2,
}
```
第3层数据不为null,则返回数据。
第3层数据为null,便从第3层
>front(List 从前往后,前驱)
>
>back(List 从后往前,后驱)获取生成方法(用于生成该层数据,填充到该层)
>
>dfs (依次获取上层数据,直至能填充目标层数据)
>
>bfs (先把该层List遍历完成,还没有填充数据才从上层获取)
**那么有什么用呢?**
示例如下:
```java
void test{
...
ApplicationContext applicationContext = SpringUtils.getApplicationContext(); // Spring 上下文
// 创建3层建造树
BuilderMapChain chain = new BuilderMapChain(3, applicationContext)
.with(redisTemplate, o -> { // redisTemplate 数据
ApplicationContext ac = (ApplicationContext) o;
return ac.getBean(RedisTemplate.class); // redisTemplate 数据不存在则从容器获取
}).withList(redisCache, Arrays.asList(
o -> {
RedisTemplate rt = (RedisTemplate) o;
return new RYRedisCache(rt); // 填充进 RYRedisCache
},
o -> {
ApplicationContext ac = (ApplicationContext) o;
return ac.getBean(RYRedisCache.class); // RYRedisCache 数据不存在则从容器获取
}
));
// 得到生成的值
RYRedisCache redisCache = chain.createFrontDfs(3).getValue(3);
}
```
里面有许许多多快速开发的工具,还请多多研究。
#### 5.*系列算法
算法都放在 top.cutexingluo.tools.utils.se.algo.cpp 包下,顾名思义,工具/SE/算法/C++,
例如二分查找
```java
int index = XTBinarySearch.lowerBound(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 5);
// c++ std::lower_bound 找到大于或等于目标的数据的位置, index = 4
```
例如字符串算法,在字符串里面查找子串,原生java是一个个匹配,遇到多重复字符速度变慢。
这里有KMP算法
```java
int index = XTStringAlgo.find("abcabcabc...abcdabcabcabc", "abcd");// 查找重复字符串
```
例如数据结构,简易线段树,线段树,动态线段树,平衡二叉树,树状数组,字典树,Splay树,Treap树,B 树,B+ 树的基础实现,可供参考
```java
BTree tree = new BTree<>(3); // B树
BPlusTree tree = new BPlusTree<>(3); // B+树
tree.put("1", "1");
tree.put("4", "4");
tree.put("2", "2");
// 实现 NavigableMap 接口,兼容基本操作
```
例如数学
```java
Point a = new Point(1.0,1.0);
Point b = new Point(1.0,2.0);
double dis = a.distance(b); // 两点距离
Point middle = a.middle(b); // 两点中点
```
例如图论,Dijkstra 最短路,最小生成树,网络流等
例如状态机(类似 map)
```java
NodeStateMachine> stateMachine = new NodeStateMachine<>();
stateMachine.put(EnumPay.ALIPAY.getCode(),
new StatusNode<>(EnumPay.ALIPAY,
Arrays.asList(
EnumPay.ALIPAY,
EnumPay.WECHAT,
EnumPay.UNIONPAY
)
));
stateMachine.put(EnumPay.WECHAT.getCode(),
new StatusNode<>(EnumPay.WECHAT,
Arrays.asList(
EnumPay.WECHAT,
EnumPay.UNIONPAY
)
));
boolean accept = stateMachine.canAcceptNode(EnumPay.ALIPAY.getCode(), EnumPay.ALIPAY.getCode());
System.out.println(accept); // true
boolean accept1 = stateMachine.canAcceptNode(EnumPay.ALIPAY.getCode(), EnumPay.WECHAT.getCode());
System.out.println(accept1); // true
boolean accept2 = stateMachine.canAcceptNode(EnumPay.ALIPAY.getCode(), EnumPay.UNIONPAY.getCode());
System.out.println(accept2); // false
boolean accept3 = stateMachine.canAcceptNode(EnumPay.ALIPAY.getCode(), EnumPay.CASH.getCode());
System.out.println(accept3); // false
StatusNode node = stateMachine.get(EnumPay.ALIPAY.getCode());
System.out.println(node); // StatusNode(node=ALIPAY, nextNodes=[ALIPAY, WECHAT, UNIONPAY])
boolean contains = node.getChildren().contains(EnumPay.ALIPAY);
System.out.println(contains); // true
```
### 🔧 注解
#### 1.***参数校验** (@XxxStatus)
必须导入 validation 包 并且参数/类上 `@Valid`或`@Validated`
不同类型参数校验注解如:
`@IntStatus` (Integer), `@StrStatus` (String)
`@ShortStatus` (Short), `@DoubleStatus` (Double) ...
```java
@Data
public class MyUserQuery {
@StrStatus(notBlankIfPresent = true, // 1.首先如果非空字符串和 null 均会进入下一步
anyStr = { // 2.必须匹配的字符串
"1", "0"
}, message = "类型格式错误")
private String type;
@StrStatus(anyReg = { // 正则匹配
RegexPool.MOBILE
}, message = "手机格式错误") // 验证
@StrJson(value = SensitiveSerializer.class, name = "PHONE") //脱敏
private String phone;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式错误") //validation包的校验
private String email;
@StrJson(value = SensitiveSerializer.class, name = "") // 返回值脱敏
private String password;
@ShortStatus(
matchNum = { // 必须匹配数字
EnumDelFlag.NOT_DELETED_CODE,
EnumDelFlag.IS_DELETED_CODE
},
message = "删除状态格式错误"
)
// @NotNull
// 可以添加 @NotNull注解 (注意是 validation 包的) 或者 @ShortStatus注解里面 notNull=true
private Short delFlag;
}
```
如上所示,各种校验注解相互配合,加快代码的开发。
#### 2.异步线程
1.可以使用**编程式**,例如 XTAsync, 或者你的类实现 ThreadHelper 接口或者 ThreadExecutorHelper 接口
下面示例作为 异步配置,同时兼容ThreadPoolTaskExecutor, AsyncConfigurer(支持@Async 注解)和 ThreadHelper (CompletableFuture 编程式操作)
```java
@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer, ThreadHelper {
@Autowired
ThreadPoolTaskExecutor taskExecutor;
@Override
public Executor getAsyncExecutor() {
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
@Override
public Executor executor() {
return taskExecutor;
}
}
```
注入该对象即可使用ThreadHelper里面的方法
## :memo:更新公告
[更新公告](./ReleaseNotes.md)