【问题标题】:Arrays.asList(word.toCharArray()) does not return a list?Arrays.asList(word.toCharArray()) 不返回列表?
【发布时间】:2018-06-25 12:32:34
【问题描述】:

我正在尝试将 String 转换为 Stream<Character> 并遇到了这个奇怪的事情。

word.toCharArray() 似乎返回了一个 Array,但是当我尝试将其转换为 Arrays.asList(word.toCharArray()) 的列表时,它似乎失败了(输出是一个完整的 String强>)。

这里发生了什么?

   @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

【问题讨论】:

  • 相关:stackoverflow.com/a/1467940/1393766(基于intcharCharacter 有同样的问题)。由于“问题解释”与“解决方案”不同,因此不会投票关闭作为重复项。
  • List 仅支持引用,不支持原语。 Arrays.asList 不会自动装箱 char[] 的元素,而是返回一个带有一个 char[] 引用的列表。

标签: java arrays string java-8 java-stream


【解决方案1】:

这里发生了什么?

这是Arrays.asList的签名:

 public static <T> List<T> asList​(T... a)

首先观察到T 必须是引用类型。所有 Java 类型参数都是引用类型。

第二个观察是a 是一个可变参数。这意味着a 可以表示为一个或多个T 实例...或T[]

以你为例。您似乎希望以下表达式生成charCharacter 的列表。

 Arrays.asList(word.toCharArray())

首先,List&lt;char&gt; 不是有效的 Java 类型,因为 char 不是引用类型。

其次,List&lt;Character&gt; 无法生成,因为签名不允许这样做。咱们试试吧。如果TCharacter,则替换为

   public static List<Character> asList(Character... a)

Character 实际上意味着Character[],而word.toCharArray() 产生char[]。 (并且Java语言不会将char[]转换为Character[]。)

事实上,实际发生的是T 匹配char[],而Arrays.asList 的结果将是List&lt;char[]&gt;。您得到的对象将是一个大小为 1 的列表,其中包含一个 char[] 元素,其中包含 word 的所有字符。

【讨论】:

    【解决方案2】:

    你可以像这样使用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);
    }
    

    【讨论】:

      【解决方案3】:

      String.toCharArray() 返回一个对象String 的数组。
      因此,在这里您流式传输包含 单个元素List:代码中的字符串数组

       Arrays.asList(word.toCharArray()).stream()
                    .peek(out::println)
                    .forEachOrdered(out::println);
      

      而你得到的结果。
      所以你应该尝试另一种方式来实现你正在寻找的东西。

      事实上,没有直接的方法可以获得CharacterStream,因为它不存在开箱即用。最接近的单一事物是IntStream,它可以处理int 的流,也可以处理short 的流或char 的流。

      按照 YCF_L 的建议,您可以使用返回 IntStreamString.chars()String.codePoints()
      char 的整数表示不适合人类阅读,因此需要将 int 元素转换为 charmapToObj()

      【讨论】:

        猜你喜欢
        • 2014-11-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 2014-03-20
        • 1970-01-01
        • 2016-09-07
        相关资源
        最近更新 更多