代码之家  ›  专栏  ›  技术社区  ›  Hearen

arrays.aslist(word.tochararray())不返回列表?

  •  2
  • Hearen  · 技术社区  · 7 年前

    我想把一个 字符串 变成一个 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
    
    3 回复  |  直到 7 年前
        1
  •  5
  •   Stephen C    7 年前

    怎么回事?

    这是的签名 Arrays.asList 以下内容:

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

    第一个观察是 T 必须是引用类型。所有Java类型参数都是引用类型。

    第二个观察是 a 是一个ValARGS参数。也就是说 可以表示为一个或多个 T 实例。。。或者 T[] 是的。

    以你为例。似乎您希望下面的表达式生成 char Character .

     Arrays.asList(word.toCharArray())
    

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

    其次, List<Character> 无法生成,因为签名不允许这样做。让我们试试。如果 T 性格 ,则替换为

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

    但是 性格 实际上是指 Character[] ,和 word.toCharArray() 产生 char[] 是的。(而且Java语言不会转换 字符[] 字符[] (第三章)

    事实上,实际发生的是 T 比赛 字符[] ,以及 数组.aslist 会是一个 List<char[]> 是的。你得到的是一个大小为1的列表 字符[] 元素,它包含 word 是的。

        2
  •  4
  •   Youcef LAIDANI    7 年前

    你可以用 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
  •  3
  •   Hearen    7 年前

    String.toCharArray() 退货 一个对象 :数组 String 是的。
    所以你在这里流一个 List 包含 单一元素 :代码中的字符串数组

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

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

    事实上,没有直接的方法 Stream 属于 Character 因为它不存在于盒子之外。最接近的是 IntStream 能够处理 int 但也有 short 或流 char 是的。

    根据YCF的建议,你可以使用 String.chars() 返回一个 Intstream公司 或者 String.codePoints() 是的。
    字符的整数表示不适合人类阅读,所以需要强制转换。 内景 元素到 烧焦 具有 mapToObj() 是的。