【问题标题】:Iterating an array of char using Java 8 Stream forEach method使用 Java 8 Stream forEach 方法迭代 char 数组
【发布时间】:2019-10-06 05:48:10
【问题描述】:

面临一个奇怪的问题 我正在尝试使用流 foreach 方法迭代 char 数组,它给出了编译时错误。如果我尝试与整数数组相同,它工作正常。有什么线索吗? 代码

String input = "test";
char[] chars = input.toCharArray();    
Arrays.stream(chars).forEach((e) -> {
   System.out.println(e); 
});

给出编译器错误 Arrays类型中的方法stream(T[])不适用于参数(char[])

如果我将它更改为 int 数组,它可以正常工作

我错过了什么?

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    没有CharStream,这就是为什么没有接受char[]Arrays.stream() 方法。下一个最接近的是IntStream

    你可以使用:

    input.chars().forEach(e -> System.out.println((char) e));
    

    【讨论】:

      【解决方案2】:

      如果你需要使用 forEach,你应该使用它的循环版本:

          String input = "test";
          char[] chars = input.toCharArray();    
          for (char c : chars) {
              System.out.println(c);
          }
      

      如果您确实需要 Stream API forEach,您可以将数组包装在列表中:

          String input = "test";
          char[] chars = input.toCharArray();    
          Arrays.asList(chars).stream().forEach(System.out::println);
      

      【讨论】:

      • 更简单:Stream.of(chars).forEach(System.out::println)
      【解决方案3】:

      我知道 Stream 的原因是接受字符,而不是字符。

      在哪里 char 是一种原始类型,表示单个 16 位 Unicode 字符,而 Character 是一个包装类,允许我们以 OOP 方式使用 char 原始概念。

          char[] chars = input.toCharArray();
          Character[] charObjectArray = ArrayUtils.toObject(chars);
          Arrays.stream(charObjectArray).forEach((e) -> {
             System.out.println(e); 
          });
      

      如果您将 char 向上转换为 Character,那么它将允许迭代。

      【讨论】:

        【解决方案4】:

        你看到的实际错误是:

        |  no suitable method found for stream(char[])
        |      method java.util.Arrays.<T>stream(T[]) is not applicable
        |        (inference variable T has incompatible bounds
        |          equality constraints: char
        |          lower bounds: java.lang.Object)
        |      method java.util.Arrays.<T>stream(T[],int,int) is not applicable
        |        (cannot infer type-variable(s) T
        |          (actual and formal argument lists differ in length))
        |      method java.util.Arrays.stream(int[]) is not applicable
        |        (argument mismatch; char[] cannot be converted to int[])
        |      method java.util.Arrays.stream(long[]) is not applicable
        |        (argument mismatch; char[] cannot be converted to long[])
        |      method java.util.Arrays.stream(double[]) is not applicable
        

        因此,如果您查看 documentation of the java.util.Arrays class 并查找 stream 方法,您确实只会看到 stream 方法被重载

        • double[] 返回 DoubleStream
        • int[] 返回 IntStream
        • long[] 返回 LongStream
        • T[] 返回 Stream&lt;T&gt;

        没有CharStream

        你是最好的选择,恕我直言:

        jshell> String input = "test";
        input ==> "test"
        
        jshell> input.codePoints().forEach((c) -> { System.out.println(c); })
        116
        101
        115
        116
        

        jshell> input.codePoints().forEach((c) -> { System.out.println((char)c); })
        t
        e
        s
        t
        

        这个问题的其他答案还有其他选择。

        【讨论】:

          猜你喜欢
          • 2016-09-19
          • 2016-02-29
          • 2011-07-29
          • 1970-01-01
          • 1970-01-01
          • 2016-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多