Java Lambda: как использовать Stream.reduce для этого? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть файл записей, каждая строка начинается с метки времени, а затем нескольких полей .. он реализует Iterable

  @SuppressWarnings("unchecked")
  @Override
  public <E extends MarkedPoint>
         Stream<E>
         stream()
  {
    return (Stream<E>) StreamSupport.stream(spliterator(), false);

  }

Я хотел бы реализовать с помощью API-интерфейса Lambda expression / streams API то, чего по сути нетпросто фильтр, но отображение / накопитель, который объединит соседние записи (элементы потока, поступающие из интерфейса Iterable), имеющие одинаковую временную метку.Мне нужен интерфейс, похожий на этот

MarkedPoint prevPoint = null;

void nextPoint(MarkedPoint in, Stream<MarkedPoint> inputStream, Stream<MarkedPoint> outputStream )
{
     while ( prevPoint.time == in.time )
     {
       updatePrevPoint(in);
       in = stream.next();
     }     
     outputStream.emit(in);
     prevPoint = in;
 } 
}

, который является грубым псевдокодом того, что, по моему мнению, близко к некоторому API, как к тому, как его предполагается использовать.самый простой способ реализации этого преобразования потока?Результирующий поток обязательно будет иметь то же или меньшее количество элементов, что и входные данные, поскольку он по сути является фильтром, и встречаются опции преобразования записей, происходящих с одной и той же отметкой времени.

Заранее спасибо

1 Ответ

0 голосов
/ 22 октября 2018

Потоки так не работают;может быть только 1 метод завершения (потребитель).То, что вы, похоже, просите, это сокращение на лету с возможным потреблением следующего элемента (ов) в вашем классе.Никаких кубиков со стандартным потоковым API.

Вы можете сначала создать список неслитых строк, а затем создать итератор, который просматривает следующий элемент (ы) и объединяет их перед возвратом следующего объединенного элемента.

...