Arrays.asList (word.toCharArray ()) не возвращает список? - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь преобразовать String в Stream<Character> и столкнулся с этой странной вещью.

Кажется, word.toCharArray() возвращает Массив , но когда я пытаюсь преобразовать его в список с помощью 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

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Что здесь происходит?

Вот подпись Arrays.asList:

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

Первое наблюдение состоит в том, что T должен быть ссылочным типом.Все параметры типа Java являются ссылочными типами.

Второе наблюдение заключается в том, что a является параметром varargs.Это означает, что a может быть выражен как один или несколько T экземпляров ... ИЛИ T[].

К вашему примеру.Кажется, вы ожидаете, что следующее выражение выдаст список char или Character.

 Arrays.asList(word.toCharArray())

Во-первых, List<char> не является допустимым типом Java, поскольку char не является ссылкойtype.

Во-вторых, List<Character> не может быть получено, потому что это не разрешено подписью.Давай попробуем.Если T равно Character, то подстановка будет

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

, но Character фактически означает Character[], а word.toCharArray() дает char[].(И язык Java не будет преобразовывать char[] в Character[].)

Фактически, на самом деле происходит то, что T соответствует char[], и результат Arrays.asList будетList<char[]>.И объект, который вы получите, будет списком размером 1 с единственным элементом char[], который содержит все символы word.

0 голосов
/ 25 июня 2018

String.toCharArray() возвращает один объект : массив String.
Таким образом, здесь вы передаете List, который содержит единственный элемент : массив строкв вашем коде

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

В то время как результат, который вы получили.
Так что вам следует попробовать другой способ достичь того, что вы ищете.

На самом деле, нет прямого способа получить Stream из Character, так как он не существует из коробки.Единственное, что ближе всего - это IntStream, который может обрабатывать поток int, но также поток short или поток char.

Как предлагает YCF_L, вы можете использовать String.chars(), который возвращает IntStream или, альтернативно, String.codePoints().
Целочисленное представление символа не подходит для чтения человеком, так требуетсяприведите int элементов к char с mapToObj().

0 голосов
/ 25 июня 2018

Вы можете использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...