繁体   English   中英

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

[英]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[]

举个例子。 您似乎希望以下表达式生成charCharacter列表。

 Arrays.asList(word.toCharArray())

首先, List<char>不是有效的Java类型,因为char不是引用类型。

其次,无法生成List<Character> ,因为签名不允许。 我们试试吧。 如果TCharacter ,那么替换就是

   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);

而你得到的结果。
所以你应该尝试另一种方式来实现你想要的。

实际上,没有直接的方法可以获得一个StreamCharacter Stream 这是最近的一件事情是IntStream能够处理的数据流int而且流的short或流char

正如YCF_L所建议的那样,您可以使用String.chars()返回IntStreamString.codePoints()
char的整数表示对于人类读取来说并不合适,因此需要使用mapToObj()int元素转换为char

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM