一个轻量级Java库,让你对字符串内容类型“优雅地检查,优雅地转换”
前言
最近在写一个简单Terminal库,我希望能够检查某个字符串的内容是否满足某个类型,比如“123”能否被转换为int。另外还想检查某个字符串的内容是否满足某个枚举类型,比如我定义一个TestEnum,里面有个Enum1类型,我希望有个isConvertible方法,使得isConvertible("Enum1", TestEnum.class)能返回true,同时再有一个convertTo方法,使得convertTo("Enum1", TestEnum.class)能返回TestEnum类型。这样,就能实现对用户输入指令的解析。
而且日常开发中也经常见到类似的需求,比如
- 从配置文件读取了一个字符串,需要转成 int、boolean 或 float
- 接收前端传过来的参数,要先判断能不能转,再实际转换
- 用户输入 "True" 和 "true",甚至“y”,“Y”,“是” 都应该被识别为布尔值 true
- 能够支持枚举类型的转换
搜了一下市面上的库,发现没有完美满足我的需求的。Hutool Convert不支持对类型的检查,Spring ConversionService又太重了,手写try-catch更是麻烦的要死。所以狠下心,干脆自己写一个吧。轻量级,0依赖,专门干这件事,并且干的很漂亮。这就是我要介绍的自己写的库
ElegantConvertChecker: https://github.com/ctimetbukii/ElegantConvertChecker
项目介绍
ElegantConvertChecker只做两件事:告诉你这个字符串能不能转换到对应类型,帮你将这个字符串转换到对应的类型。它有如下特点:
- 依赖:除JUnit5用于测试外,不依赖任何其他第三方库
- 极致的轻量:只有2个核心工具类 ConvertChecker(用于转换检查)+ Convert(用于转换),和3个异常类,引入成本极低
- 支持 Java8+:主流版本都兼容,老项目也能用
- 四种转换策略:从严谨到宽松,总有一种适合你的需求
- 额外提供Optional API:不喜欢抛出异常?用Optional优雅处理失败
- 可配置的布尔标记:自定义某个字符串被转换为布尔类型
- 详细的javadoc:功能类的每个方法都有几十行的javadoc详细解释与示例
- 封装好的建议方法:除了提供isConvertible(String source, Class
targetType) 这种通用方法外,还提供isConvertibleToBool, isConvertibleToInt这种常见需求封装
下面介绍2个核心类
ConvertChecker:检查能不能转换
只需要传入原始的字符串,和你期望转换的类型,就能够优雅地检查该字符串能否转换到你期望的类型:
// 判断 "123" 能否严格转为 Integer
ConvertChecker.isConvertible("123", Integer.class); // true
// 判断 "123.13324234234" 能否宽松转为 Float
ConvertChecker.isCoercible("123.13324234234", Float.class); // true(允许精度损失)
// 判断 "True" 能否解释为 Boolean
ConvertChecker.isInterpretable("True", Boolean.class); // true(大小写不敏感)
// 组合判断:解释或强制,任意一种成功即可
ConvertChecker.isCoercibleWithInterpretable("y", Boolean.class); // true
检查的方法有 isConvertible, isCoercible, isInterpretable 和 isCoercibleWithInterpretable 四种,分别对应4种不同的转换策略。4种策略在下文会介绍,在项目的README以及方法的javadoc上也有详细说明。
Converter:执行转换
使用Converter类进行实际转换,每种策略都有2种API风格
| 风格 | 示例 | 失败行为 |
|---|---|---|
| 直接返回结果 | convertToInt() | 抛 ConvertCastException |
| 返回Optional |
convertOptionalToInt() | 返回 Optional.empty() |
你想怎么处理失败,就怎么处理失败
四种转换策略详解
1.CONVERT —— 严格模式
最严格的策略,字符串必须精确匹配目标类型的格式。对于小数,向float转换时,严格要求不能有精度损失,适合对数据格式要求高的场景。
Converter.convertToInt("42"); // 42
Converter.convertToBool("true"); // true
Converter.convertToBool("True"); // 抛出 ConvertCastException(大小写敏感!)
Converter.convertTo("Enum1", MyEnum.class); // MyEnum.Enum1
- 布尔值:只认 "true" 或者 "false",并且严格区分大小写
- 枚举:大小写敏感,进行精确匹配
- 空字符串:视为无效,除非目标类型为String/Object
- 首尾有空格:影响转换结果,可能导致转换失败
可以在 README 和 源码 中查看详细策略。
2.COERCE —— 强制模式
允许一定的精度损失,普通强转能转换的它也就都能转换。float精度损失也无所谓。适合“能转换就行”的场景。字符串首尾的空格仍然可能导致转换失败。
Converter.coerceToFloat("3.141592653589793"); // 3.1415927f(截断也接受)
Converter.coerceToInt("12.5"); // 抛出 CoerceCastException(有小数部分,不行)
3.INTERPRET —— 解释模式
最灵活的模式。解释模式的核心思想是,如果认为这个字符串的内容能够被看作,被解释成某种类型,那么就可以转换。因此,解释模式下,字符串首尾的空格不会导致转换失败,在targetType不是String和Object时,这些首尾空格将被裁剪。该模式下大小写不敏感,tRue和True都可以被解释为true,除此之外,还支持自定义的布尔标记。你可以把y,Y,是,YES等等任何你想的字符串设置解释为布尔类型。适合处理用户输入,配置文件等不那么严谨的数据。
Converter.interpretToInt(" 42 "); // 42(自动 trim)
Converter.interpretToBool("True"); // true(大小写不敏感)
Converter.interpretToBool("y"); // true(单字符标记)
Converter.interpretToBool("NO"); // false
默认的布尔标记除了大小写不敏感的true和false外,还有
| 值 | 代表 |
|---|---|
| T, t, Y, y, 1 | true |
| F, f, N, n, 0 | false |
这些是可以配置的,通过 ConvertChecker.getTrueInterpretableStrs() 和 ConvertChecker.getFalseInterpretableStrs() 可以获取一个包含了标记的Set。两个方法分别返回标记true的Set
// 想让 "是" 和 "否" 也能识别?
ConvertChecker.getTrueInterpretableStrs().add("是");
ConvertChecker.getFalseInterpretableStrs().add("否");
Converter.interpretToBool("是"); // true
Converter.interpretToBool("否"); // false
4.COERCE_WITH_INTERPRET —— 组合模式
这种模式下,会先尝试Interpret,失败了再尝试 Coerce。这种情况下的转换是最宽松的。在Coerce下,首尾的空格不被允许,不能自定义布尔标记;而在Interpret下,float的精确性截断又不被允许。这种组合模式将Coerce和Interpret结合在一起,最宽松地完成转换。
Converter.coerceOrInterpretToFloat("123.125"); // 123.125f(精确解释)
Converter.coerceOrInterpretToFloat("123.13324234234"); // 123.13324f(强制转换,截断)
Converter.coerceOrInterpretToBool(" True "); // true
异常体系
ElegantConvertChecker 有3个异常类,对应3种失败场景
RuntimeException
├── ConvertCastException — CONVERT 策略失败
├── CoerceCastException — COERCE 策略失败
└── InterpretCastException — INTERPRET 和 COERCE_WITH_INTERPRET 策略失败
快速上手
Maven依赖如下
<dependency>
<groupId>io.github.ctimetbukii</groupId>
<artifactId>elegant-convert-checker-core</artifactId>
<version>1.0.0</version>
</dependency>
下面给出一个完整的示例
import io.github.ctimetbukii.elegantconvertchecker.*;
public class QuickStart {
public static void main(String[] args) {
// 1. 先检查,再转换
if (ConvertChecker.isConvertible("123", Integer.class)) {
int value = Converter.convertToInt("123");
System.out.println(value); // 123
}
// 2. Optional 风格,优雅处理失败
Converter.convertOptionalToInt("abc")
.ifPresentOrElse(
v -> System.out.println("成功: " + v),
() -> System.out.println("转换失败")
);
// 3. 解释模式:灵活处理用户输入
boolean agree = Converter.interpretToBool("YES"); // true
boolean decline = Converter.interpretToBool("n"); // false
// 4. 枚举转换(大小写不敏感)
Color color = Converter.interpretTo("red", Color.class);
System.out.println(color); // Color.RED
}
enum Color { RED, GREEN, BLUE }
}
项目地址
Github: https://github.com/ctimetbukii/ElegantConvertChecker
License: MIT
如果你觉得有用/好用,给个Star⭐吧~ 谢谢喵 !
写在最后
这个项目的初衷很简单:转换应该是一件优雅的事。字符串转换而已,不应该每次都要写一堆try-catch或者引入一个几十MB的臃肿的工具包。
用 ElegentConvertChecker , 2个类,4种转换策略,覆盖你90%的字符串转类型需求。
先检查,再转换,让每一次转换都是可控的。
真的不给个 Star⭐ 吗喵?>︿<
posted on 2026-07-11 14:36 CTimet_bukii 阅读(5) 评论(0) 收藏 举报
浙公网安备 33010602011771号