Если вы хотите использовать потоки, вы можете сделать это примерно так:
Deque<String> deque = num.chars()
.map(c -> Character.toString((char) c))
.map(Integer::parseInt)
.collect(Collector.of(
ArrayDeque::new,
(stack, i) -> stack.addFirst(i),
(s1, s2) -> { s2.addAll(s1); return s2; })); //this combiner won't really be called unless the stream was parallel
Integer[] reversed = deque.toArray(new Integer[deque.size()]);
Это перебирает список только один раз.Deque
может работать как стек, Last In First Out, поэтому каждый addFirst()
автоматически меняет порядок, поскольку добавляет каждый элемент вперед, а не в конец списка.Вы можете затем преобразовать его в массив или использовать Deque
как есть, что является нормальным Collection
и реализует Iterable
.
Как уже упоминалось в других ответах, вы также можете немного упростить его, например, если вы на 100% уверены, что у вас есть только цифры, потому что в упрощенной версии вы не получите NumberFormatException
.
Deque<String> deque = num.chars()
.map(c -> Character.getNumericValue((char) c))
.collect(Collector.of(
ArrayDeque::new,
(stack, i) -> stack.addFirst(i),
(s1, s2) -> { s2.addAll(s1); return s2; }));
Integer[] reversed = deque.toArray(new Integer[deque.size()]);