猿问

使用 Java 8 Stream forEach 方法迭代 char 数组

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


String input = "test";

char[] chars = input.toCharArray();    

Arrays.stream(chars).forEach((e) -> {

   System.out.println(e); 

});

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


如果我将其更改为 Array of int ,它工作正常


我缺少什么?


慕的地10843
浏览 168回答 4
4回答

慕神8447489

我知道 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,那么它将允许迭代。

慕码人2483693

没有CharStream,这就是为什么没有Arrays.stream()接受 的方法char[]。下一个最接近的东西是IntStream.您可以使用:input.chars().forEach(e -> System.out.println((char) e));

潇湘沐

如果你需要使用 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);

撒科打诨

您看到的实际错误是:|  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因此,如果您查看该类的文档java.util.Arrays并查找该stream方法,您确实只会看到该stream方法被重载了double[]返回一个DoubleStreamint[] 返回一个IntStreamlong[] 返回一个LongStreamT[] 返回一个Stream<T>只是没有一个CharStream.恕我直言,你最好的选择是:jshell> String input = "test";input ==> "test"jshell> input.codePoints().forEach((c) -> { System.out.println(c); })116101115116或者jshell> input.codePoints().forEach((c) -> { System.out.println((char)c); })test这个问题的其他答案有其他选择。
随时随地看视频慕课网APP

相关分类

Java
我要回答