Подтвердить что ты не робот

Хотите создать поток символов из массива char в java

Из массива char я хочу построить поток для использования функций java 8, таких как фильтры и карты.

char[] list = {'a','c','e'};
Stream<Character> cStream = Stream.of(list);
// Stream<Character> cStream = Arrays.stream(list);

Первый метод не работает (Причина: смените cStream на Stream<char[]>). Прокомментированная строка также не работает (Причина: метод stream(T[]) в типе Массивы не применим для аргументов (char[])).

Я знаю, что если char[] list изменено на int[], все работает отлично, используя IntStream. Но я не хочу конвертировать каждый char[] в int[] каждый раз или изменять в список, когда мне нужно использовать библиотеку потоков в массиве char.

4b9b3361

Ответ 1

Вы можете использовать IntStream для генерации индексов, за которыми следует mapToObj:

char[] arr = {'a','c','e'};
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]);

Ответ 2

Способ сделать это через объект String:

char[] list = {'a','c','e'};
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i);

Мне нравится делать это так, потому что вся сложность преобразования массива завершается в создание String, а wrapping из char также выполняется за сценой для меня, поэтому я могу сосредоточиться на бизнес-логике.

Ответ 3

Коротким и эффективным способом создания массива IntStream из char[] является использование java.nio.CharBuffer:

char[] list = {'a','c','e'};
IntStream stream = CharBuffer.wrap(list).chars();

Таким образом вы можете использовать IntStream, интерпретируя значения int как символы. Если вы хотите коробку Stream<Character> (которая может быть менее эффективной), используйте

Stream<Character> stream = CharBuffer.wrap(list).chars().mapToObj(ch -> (char)ch);

Использование CharBuffer может быть немного быстрее, чем IntStream.range, поскольку внутри него есть собственный разделитель, поэтому ему не нужно выполнять дополнительную лямбду (возможно, как медленный полиморфный вызов). Также он относится к массиву char[] только один раз, а не внутри лямбда, поэтому его можно использовать с нереальным значением переменной массива или возвращаемым значением функции (например, CharBuffer.wrap(getCharArrayFromSomewhere()).chars()).

Ответ 4

Простейшим изменением, которое вы можете внести в код, является изменение char[] на Character[].

Другой способ - создать новый ArrayList в коробке char s:

char[] list = {'a','c','e'};
List<Character> listArray = new ArrayList<>();
for (char c : list)
    listArray.add(c);
Stream<Character> cStream = listArray.stream();

Кроме того, вы можете использовать класс Guava Chars, чтобы заменить цикл for на:

List<Character> listArray = Chars.asList(list);