индексирование <Stream>данные Java - PullRequest
0 голосов
/ 04 мая 2020

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

return Stream.concat(firstStream, secondStream) <- these need to be indexed
      .sorted(// sorted using Comparator)
      .forEach? .map? // the class has index field with getter and setter so I think need to do `setIndex(i)` but wasnt sure where to get 'i'

Любая рекомендация будет принята с благодарностью!

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Если вы можете создавать свои потоки самостоятельно из списков, используйте IntStream индексов, а не Stream объектов.

IntStream.range(0, firstList.size()).forEach(i -> firstList.get(i).setIndex(i));
int offsetForSecondList = firstList.size();
IntStream.range(0, secondList.size())
        .forEach(i -> secondList.get(i).setIndex(offsetForSecondList + i));

Я не пытался скомпилировать код, поэтому простите за любую опечатку.

В противном случае ваш AtomicReference подход тоже работает.

1 голос
/ 04 мая 2020

Предполагая, что у вас есть класс MyObject:

class MyObject{
    int index;
    String name;
    //getters,setters,cons, toString...
}

Нечто подобное ниже может быть отправной точкой:

public static Stream<MyObject> fooBar(){
    //just for example, inorder to get the streams to be concatnated
    List<MyObject> first = List.of(new MyObject("foo"),new MyObject("foo"),new MyObject("foo"));
    List<MyObject> second = List.of(new MyObject("bar"),new MyObject("bar"),new MyObject("bar"));

    AtomicInteger ai = new AtomicInteger(0);

    return Stream.concat(first.stream(), second.stream())
            .peek(myo -> myo.setIndex(ai.getAndIncrement()));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...