[英]Arrays.asList(word.toCharArray()) does not return a list?
我正在尝试将String转换为Stream<Character>
并遇到这个奇怪的事情。
似乎word.toCharArray()
返回一个数组 ,但当我尝试通过Arrays.asList(word.toCharArray())
将其转换为列表时,它似乎失败了(输出是一个完整的字符串 )。
这里发生了什么?
@Test
public void testCharacterStream() {
characterStreamNew("HELLO");
}
private Stream<Character> characterStreamNew(String word) {
for(Character c: word.toCharArray()) {
out.println(c);
}
Arrays.asList(word.toCharArray()).stream()
.peek(out::println)
.forEachOrdered(out::println);
return null;
}
这是输出:
H
E
L
L
O
HELLO
HELLO
这里发生了什么?
这是Arrays.asList
的签名:
public static <T> List<T> asList(T... a)
首先观察到T
必须是参考类型。 所有Java类型参数都是引用类型。
第二个观察是a
是varargs参数。 这意味着a
可以表示为一个或多个T
实例......或者一个T[]
。
举个例子。 您似乎希望以下表达式生成char
或Character
列表。
Arrays.asList(word.toCharArray())
首先, List<char>
不是有效的Java类型,因为char
不是引用类型。
其次,无法生成List<Character>
,因为签名不允许。 我们试试吧。 如果T
是Character
,那么替换就是
public static List<Character> asList(Character... a)
但是Character
实际上意味着Character[]
,而word.toCharArray()
生成一个char[]
。 (并且Java语言不会将char[]
转换为Character[]
。)
实际上,实际发生的是T
匹配char[]
,而Arrays.asList
的结果将是List<char[]>
。 并且您获得的对象将是一个大小为1的列表,其中包含一个char[]
元素,其中包含word
所有字符。
您可以像这样使用chars()
:
word.chars()
.mapToObj(c -> (char) c)
.forEachOrdered(System.out::println);
输出
H
E
L
L
O
您的方法可能如下所示:
private static Stream<Character> characterStreamNew(String word) {
return word.chars().mapToObj(c -> (char) c);
}
String.toCharArray()
返回一个对象 :一个String
数组。
所以在这里流式传输一个包含单个元素的List
:代码中的String数组
Arrays.asList(word.toCharArray()).stream()
.peek(out::println)
.forEachOrdered(out::println);
而你得到的结果。
所以你应该尝试另一种方式来实现你想要的。
实际上,没有直接的方法可以获得一个Stream
的Character
Stream
。 这是最近的一件事情是IntStream
能够处理的数据流int
而且流的short
或流char
。
正如YCF_L所建议的那样,您可以使用String.chars()
返回IntStream
或String.codePoints()
。
char的整数表示对于人类读取来说并不合适,因此需要使用mapToObj()
将int
元素转换为char
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.