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上找到。