Итерация массива char с использованием метода Java 8 Stream forEach - PullRequest
0 голосов
/ 06 октября 2019

Столкнувшись с одной странной проблемой, я пытаюсь перебрать массив символов с помощью метода stream foreach, он дает ошибку времени компиляции. Если я пытаюсь сделать то же самое с массивом целых чисел, он работает нормально. какая-нибудь подсказка? код

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

с сообщением об ошибке компилятора Поток метода (T []) в типе Arrays не применим для аргументов (char [])

, если яизмените его на Array of int, он отлично работает

что мне не хватает?

Ответы [ 4 ]

1 голос
/ 06 октября 2019

Нет CharStream, поэтому нет метода Arrays.stream(), который принимает char[]. Следующая ближайшая вещь - IntStream.

Вы можете использовать:

input.chars().forEach(e -> System.out.println((char) e));
0 голосов
/ 06 октября 2019

Если вам нужно использовать 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);
0 голосов
/ 06 октября 2019

Причина, по которой я знаю, что Stream принимает Character, а не char.

Где char - это примитивный тип, представляющий один 16-битный символ Unicode, тогда как Character - это класс-оболочка, который позволяет нам использовать концепцию char примитива. в ООП-типе.

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

Если вы преобразуете символ в символ, то это разрешит итерацию.

0 голосов
/ 06 октября 2019

Фактическая ошибка, которую вы видите:

|  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[], возвращающего DoubleStream
  • int[], возвращающего IntStream
  • long[]возврат LongStream
  • T[] возврат Stream<T>

Просто нет 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

Другие ответы на этот вопрос имеют другие альтернативы.

...