1. 概述

在这个教程中,我们将探讨在Java中以优雅的方式封装将字符串转换为整数的方法的不同方式。

2. 问题描述

Integer.parseInt() 方法通常用于将字符串转换为整数,但如果输入不是数字时,它会抛出异常。

使用 try-catch 块来处理这个异常可能会使代码变得重复且难以阅读:

try {
    return Integer.parseInt(input);
} catch (NumberFormatException e) {
    logger.error("Encountered an exception while converting string to int");
}

相反,我们可以将转换逻辑封装在一个方法中,处理异常并返回一个错误时的合适值。这也有助于未来修改或更新错误处理逻辑。

现在,让我们来看看实现这种封装的一些方法。

3. 封装转换

本节将探讨几种将字符串转换为整数逻辑封装的方法。我们可以使用 Optional 来封装 Integer 类的结果,或者表示转换失败:

3.1. 使用 Integer.parseInt()

我们可以使用 Integer 类提供的 parseInt() 方法将字符串值转换为整数。一个 try-catch 块可以处理所有异常,特别是 NumberFormatException,并在出现错误时返回默认值:

Optional<Integer> convertStringToIntUsingIntegerParseInt(String input) {
    try {
        return Optional.of(Integer.parseInt(input));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

此方法利用了自动装箱(autoboxing)将基本类型 int 转换为其对应的包装类 Integer

3.2. 使用 Integer.valueOf()

在Java中,valueOf() 方法是某些类(如 String, Integer, Double 等)的静态方法,用于将值的字符串表示转换为对应类的对象。

如果在 Integer 包装类上使用,它会内部调用 *parseInt()*。我们可以使用此方法在一个封装的方法中实现转换并处理错误:

Optional<Integer> convertStringToIntUsingIntegerValueOf(String input) {
    try {
        return Optional.of(Integer.valueOf(input));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

3.3. 使用 Integer.decode()

Integer.decode() 的工作原理类似于 *Integer.valueOf()*,但也能接受其他一些数字表示,如十进制、十六进制和八进制:

Optional<Integer> convertStringToIntUsingIntegerDecode(String input) {
    try {
        return Optional.of(Integer.decode(input));
    } catch (Exception e) {
        return Optional.empty();
    }
}

3.4. 使用Apache Commons的 NumberUtils

我们可以使用Apache Commons Lang 3库中的 NumberUtils 类提供的 Integer 转换方法。要在项目中使用该库,需要在 pom.xml 文件中添加依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

它接受一个默认值,当转换失败时返回。我们可以使用 toInt() 方法来实现封装: