CTimet_bukii

导航

一个轻量级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和标记false的Set。上表中的内容已经被默认添加。你可以获取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)    收藏  举报