в случае, если вы не хотите ждать the Java 9 solution, вот поток завода, который работает под Java 8.
public static <T> Stream<T> pop(Stack<T> stack) {
return StreamSupport.stream(new Spliterators.AbstractSpliterator<T>(
stack.size(), Spliterator.ORDERED|Spliterator.SIZED) {
public boolean tryAdvance(Consumer<? super T> action) {
if(stack.isEmpty()) return false;
action.accept(stack.pop());
return true;
}
}, false);
}
Обратите внимание, что это указывает начальный размер стека, принимая его как должное, что подразумевает, что вы не должны менять промежуточный стек (модификация источника потока в промежутке - это плохая идея в любом случае). С другой стороны, это сделает некоторые операции Stream более эффективными, чем вариант итерации.
Теперь общее предупреждение, которое применяется к обоим вариантам. Источники потока, которые были изменены из-за текущей операции Stream, например, выбирая элементы, которые потребляет Stream, могут оставить источник в непредсказуемом состоянии. Операции короткого замыкания могут не потреблять все элементы и в сочетании с параллельными потоками, они все равно могут потреблять больше элементов, чем это необходимо для работы терминала.
Так аналогично BufferedReader.lines()
После выполнения операции терминала потока нет никаких гарантий того, что читатель будет в определенном положении, из которого читать следующий символ или строку.
Вы не должны делать какие-либо предположения относительно содержимого Stack
после потребления элементов таким образом.
Потоки должны использоваться для получения новых данных из заданного набора данных. Но вы также пытаетесь изменить стек. Использование потоков - это не очень хорошая идея. Если вы не в порядке с вызовом '' 'clear''' в конце. –
'stack.stream(). Map (...) ...' 'stack.clear()' Я бы не стал манипулировать структурой данных, используя поток поверх нее. Большинство программистов будут удивлены этим побочным эффектом, когда они прочтут такой код. В случае, если вы ищете более «элегантный» синтаксис, рассмотрите возможность переноса операции в итераторе. –
Следует также упомянуть, что '' 'Deque''' предпочтительнее' '' Stack''' –