1. 概述

在这个快速教程中,我们将探讨如何在Java中将一个字符串数组转换为整数数组。

2. 问题介绍

首先,看一个字符串数组的例子:

String[] stringArray = new String[] { "1", "2", "3", "4", "5", "6", "42" };

我们创建了一个名为stringArray的字符串数组,包含七个元素。现在,我们需要将stringArray转换为整数数组:

int[] expected = new int[] { 1, 2, 3, 4, 5, 6, 42 };

如上例所示,需求相当直接。然而,在实际应用中,字符串数组可能来自不同的源,如用户输入或另一个系统。因此,输入数组可能会包含一些非有效数字格式的值,例如:

String[] stringArrayWithInvalidNum = new String[] { "1", "2", "hello", "4", "world", "6", "42" };

"hello""world"不是有效的数字,尽管其他的是。在实际项目中,当遇到这类值时,我们通常会遵循特定的错误处理规则——比如停止数组转换,使用特定的整数作为备选,并进行其他操作。

在这个教程中,我们将使用Java的最小整数作为无效字符串元素的备选:

int[] expectedWithInvalidInput = new int[] { 1, 2, Integer.MIN_VALUE, 4, Integer.MIN_VALUE, 6, 42 };

接下来,我们从一个所有有效元素的字符串数组开始,然后添加错误处理逻辑。

为了简化,我们将使用单元测试断言来验证我们的解决方案是否按预期工作。

3. 使用Stream API

首先,使用Stream API将所有有效元素的字符串数组转换:

int[] result = Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray();
assertArrayEquals(expected, result);

如图所示,Arrays.stream()方法将输入字符串数组转换为一个Stream。然后,**mapToInt()中间操作将我们的流转换为一个IntStream对象**。

我们使用Integer.parseInt()将字符串转换为整数。最后,toArray()IntStream对象转换回数组。

现在,让我们看看在无效数字格式的情况下,数组中的元素情况。

如果输入字符串的格式不是一个有效的数字,Integer.parseInt()方法会抛出NumberFormatException

因此,我们需要在mapToInt()方法中的方法引用Integer::parseInt处替换为lambda表达式,并在lambda表达式中处理NumberFormatException异常:

int[] result = Arrays.stream(stringArrayWithInvalidNum).mapToInt(s -> {
    try {
        return Integer.parseInt(s);
    } catch (NumberFormatException ex) {
        // logging ...
        return Integer.MIN_VALUE;
    }
}).toArray();

assertArrayEquals(expectedWithInvalidInput, result);

运行测试后,它会通过。

如代码所示,我们只更改了mapToInt()方法的实现。

值得一提的是,Java Stream API在Java 8及更高版本中可用

4. 在循环中实现转换

我们已经了解了Stream API如何解决问题。但是,如果我们使用的是较旧的Java版本,我们需要以不同的方式解决这个问题。

现在,我们知道Integer.parseInt()完成了主要的转换工作,我们可以遍历数组中的每个元素,并对每个字符串元素调用Integer.parseInt()方法

int[] result = new int[stringArray.length];
for (int i = 0; i < stringArray.length; i++) {
    result[i] = Integer.parseInt(stringArray[i]);
}

assertArrayEquals(expected, result);

如上所示,我们首先创建一个与输入字符串数组长度相同的整数数组。然后,在for循环中执行转换并填充结果数组。

接下来,扩展实现以添加错误处理逻辑。与Stream API的方法类似,只需在转换行周围添加一个try-catch块即可解决问题

int[] result = new int[stringArrayWithInvalidNum.length];
for (int i = 0; i < stringArrayWithInvalidNum.length; i++) {
    try {
        result[i] = Integer.parseInt(stringArrayWithInvalidNum[i]);
    } catch (NumberFormatException exception) {
        // logging ...
        result[i] = Integer.MIN_VALUE;
    }
}

assertArrayEquals(expectedWithInvalidInput, result);

运行测试时,它会通过。

5. 总结

在这篇文章中,我们通过示例学习了两种将字符串数组转换为整数数组的方法。此外,我们还讨论了在字符串数组包含无效数字格式时如何处理转换。

如果我们的Java版本为8或更高,Stream API将是解决此问题的最直观方案。否则,我们可以遍历字符串数组并逐个将字符串元素转换为整数。

如往常一样,文章中展示的所有代码片段可在GitHub上找到。


» 下一篇: Java Weekly, 第471期