概述
本教程将探讨如何使用Java流(Java Streams)将整数数组转换为字符串数组。我们将对比处理Integer
数组和基本类型int
值时所需的方法。对于Integer
数组,我们将利用Stream<Integer>
以及Integer
从Object
继承的方法进行转换。而对于int
,我们将使用专用的IntStream
。
2. 从数组创建流
首先,我们将数组转换为流。对于Integer
和基本整数,我们都可以使用相同的方法,但返回类型会有所不同。如果我们有一个Integer
数组,我们将得到一个Stream<Integer>
:
Integer[] integerArray = { 1, 2, 3, 4, 5 };
Stream<Integer> integerStream = Arrays.stream(integerArray);
相反,如果我们的数组包含基本整数,我们将得到一个IntStream
:
int[] intArray = { 1, 2, 3, 4, 5 };
IntStream intStream = Arrays.stream(intArray);
IntStream
提供了我们稍后用于类型转换的独特方法。
3. 从Integer
转换
有了Stream<Integer>
,我们可以继续将Integer
转换为字符串。由于Integer
提供了对Object
所有方法的访问,我们可以使用Object.toString()
和map()
方法:
String[] convertToStringArray(Integer[] input) {
return Arrays.stream(input)
.map(Object::toString)
.toArray(String[]::new);
}
然后,我们可以使用convertToStringArray()
将Integer
数组转换为字符串数组,并确认返回的字符串数组符合预期:
@Test
void whenConvertingIntegers_thenHandleStreamOfIntegers() {
Integer[] integerNumbers = { 1, 2, 3, 4, 5 };
String[] expectedOutput = { "1", "2", "3", "4", "5" };
String[] strings = convertToStringArray(integerNumbers);
Assert.assertArrayEquals(expectedOutput, strings);
}
4. 从基本整数转换
现在让我们看看如何处理由整数数组开始得到的IntStream
。
4.1. 返回数组
有了IntStream
,我们可以使用IntStream.mapToObj()
进行转换:
String[] convertToStringArray(int[] input) {
return Arrays.stream(input)
.mapToObj(Integer::toString)
.toArray(String[]::new);
}
mapToObj()
方法使用我们提供的Integer.toString()
方法返回一个对象值的Stream
。在这个方法阶段之后,我们得到了一个可以使用toArray()
收集内容的Stream<String>
。
接着,我们可以再次使用convertToStringArray()
验证得到的字符串数组与输入的整数数组匹配:
@Test
void whenConvertingInts_thenHandleIntStream() {
int[] intNumbers = { 1, 2, 3, 4, 5 };
String[] expectedOutput = { "1", "2", "3", "4", "5" };
String[] strings = convertToStringArray(intNumbers);
Assert.assertArrayEquals(expectedOutput, strings);
}
如果我们想在流中利用Integer
类型的优点,我们可以使用boxed()
:
String[] convertToStringArrayWithBoxing(int[] input) {
return Arrays.stream(input)
.boxed()
.map(Object::toString)
.toArray(String[]::new);
}
4.2. 返回单个字符串
另一个可能的用例是将整数数组转换为单个字符串。我们可以在此基础上重用上面的代码,结合Stream.collect()
方法将流压缩成一个字符串。collect()
方法非常灵活,可以将流终止到各种类型。这里,我们将传递Collectors.joining(", ")
,这样数组中的每个元素都会被连接成一个带有逗号分隔的单个字符串:
String convertToString(int[] input){
return Arrays.stream(input)
.mapToObj(Integer::toString)
.collect(Collectors.joining(", "));
}
然后我们可以测试返回的字符串是否符合预期:
@Test
void givenAnIntArray_whenUsingCollectorsJoining_thenReturnCommaSeparatedString(){
int[] intNumbers = { 1, 2, 3, 4, 5 };
String expectedOutput = "1, 2, 3, 4, 5";
String string = convertToString(intNumbers);
Assert.assertEquals(expectedOutput, string);
}
5. 总结
在这篇文章中,我们学习了如何使用Java流将Integer
数组或基本整数数组转换为字符串数组。处理Integer
时,我们期望得到的是Stream<Integer>
。然而,处理基本整数时,我们期待的是IntStream
。
接着,我们探讨了如何处理这两种流类型,最终得到字符串数组。map()
方法适用于Stream<Integer>
,而mapToObj()
方法适用于IntStream
。最后,我们看到了如何使用Collectors.joining()
返回单个字符串。
如往常一样,示例代码的完整版本可在GitHub上找到。