Hea*_*ren 2 java arrays string java-8 java-stream
我试图将一个字符串转换为一个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;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
H
E
L
L
O
HELLO
HELLO
Run Code Online (Sandbox Code Playgroud)
你可以chars()像这样使用:
word.chars()
.mapToObj(c -> (char) c)
.forEachOrdered(System.out::println);
Run Code Online (Sandbox Code Playgroud)
输出
H
E
L
L
O
Run Code Online (Sandbox Code Playgroud)
您的方法可能如下所示:
private static Stream<Character> characterStreamNew(String word) {
return word.chars().mapToObj(c -> (char) c);
}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
这是以下的签名Arrays.asList:
public static <T> List<T> asList?(T... a)
Run Code Online (Sandbox Code Playgroud)
首先T要注意的是必须是参考类型.所有Java类型参数都是引用类型.
第二个观察是avarargs参数.这意味着a可以表示为一个或多个T实例......或者a T[].
举个例子.您似乎希望以下表达式生成charor 的列表Character.
Arrays.asList(word.toCharArray())
Run Code Online (Sandbox Code Playgroud)
首先,List<char>它不是有效的Java类型,因为char它不是引用类型.
其次,List<Character>由于签名不允许,不能生成.我们试试吧.如果T是Character,则替换将是
public static List<Character> asList(Character... a)
Run Code Online (Sandbox Code Playgroud)
但Character实际上意味着Character[],并word.toCharArray()产生一个char[].(并且Java语言不会转换char[]为Character[].)
事实上,实际发生的是T匹配char[],结果Arrays.asList将是一个List<char[]>.你得到的对象将是一个大小为1的列表,char[]其中包含一个包含所有字符的单个元素word.