Arrays.asList(word.toCharArray())不返回列表?

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)

YCF*_*F_L 5

你可以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)


Ste*_*n C 5

这里发生了什么?

这是以下的签名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>由于签名不允许,不能生成.我们试试吧.如果TCharacter,则替换将是

   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.