Есть ли способ перебрать Java-поток, принимая за раз два элемента вместо одного?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Есть ли способ перебрать Java-поток, принимая за раз два элемента вместо одного?

Сообщение Anonymous »

Предположим, у нас есть этот поток

Код: Выделить всё

Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j");
и я хочу сохранить на карте пары соседних строк, первая из которых начинается с «err».
Я подумал примерно так

Код: Выделить всё

Map map = new HashMap();

Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.reduce((acc, next) -> {
if (acc.startsWith("err"))
map.put(acc,next);
if (next.startsWith("err"))
return next;
else
return "";
});
Но меня это не совсем устраивает по двум основным причинам
  • Я «неправильно использую» функцию сокращения. В Stream API каждая функция имеет свое четкое, четко определенное назначение: max должен вычислять максимальное значение, filter должен фильтровать на основе условия, сокращение должно создавать постепенно накапливаемое значение и так далее.
  • Это мешает мне использовать мощные механизмы Streams: что, если я хочу ограничить свой поиск первыми двумя результатами?
Здесь я использовал сокращение, потому что (насколько Я знаю) это единственная функция, которая позволяет сравнивать пару значений, что каким-то образом может привести к чему-то похожему на понятия «текущее значение» и «следующее значение».
Есть ли более простой способ? Что-то, что позволяет вам перебирать поток, учитывая более одного значения для каждой итерации?
Я имею в виду некий механизм, который, учитывая текущий элемент, позволяет вам определить «окно элементов» для рассмотрения для каждой итерации.
Что-то вроде

Код: Выделить всё

 Stream mapMoreThanOne(
int elementsBeforeCurrent,
int elementsAfterCurrent,
Function

Подробнее здесь: [url]https://stackoverflow.com/questions/34086461/is-there-a-way-to-iterate-a-java-stream-taking-two-elements-a-time-instead-of-on[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»