2014-10-11 8 views

ответ

19

Вы можете использовать toList() или toSortedList(). Напр.

observable.toList(myObservable) 
      .subscribe({ myListOfSomething -> do something useful with the list }); 
+7

Это не преобразует его в список. Это в основном то же самое, что я назвал 'subscribe'. –

+1

также обратите внимание, что toList() создает список только после завершения последовательности, поэтому не подходит для длинного потока – Schneider

-13

Найден это сам

public static <T> List<T> toList(Observable<T> observable) { 
    final List<T> list = new ArrayList<T>(); 

    observable.toBlocking().forEach(new Action1<T>() { 
     @Override 
     public void call(T t) { 
      list.add(t); 
     } 
    }); 

    return list; 
} 
+4

Это немного анти-шаблон. Вместо этого используйте 'Observable.toList()' и убедитесь, что 'Observable' не бесконечен или у вас будут проблемы. – tmn

+0

Как сказал Томас, вы можете пересмотреть принятие этого, это не способ сделать это. – tokland

66

Надеется, что это помогает.

List<T> myList = myObservable.toList().toBlocking().single();

благодаря

Ананд Раман

+4

приведет к блокировке, а не asyn –

+0

@ZulqurnainJutt - вызов 'toBlocking' отдать его? (Вопрос не требует, чтобы он был асинхронным) –

0

Вы не можете конвертировать наблюдаемым в список в любом идиоматических способом, потому что список не является действительно тип, который вписывается в Rx.

Если вы хотите, чтобы заполнить список с событиями, полученными от наблюдаемого потока, который вы должны в основном создать список и добавить элементы в методе Subscribe как так (C#):

IObservable<EventType> myObservable = ...; 
var list = new List<EventType>(); 
myObservable.Subscribe(evt => list.Add(evt)); 

В ToList -Style операторы предоставляют список только после завершения потока (как IObservable<List<T>>), поэтому это не полезно в сценариях, где у вас долгоживущий поток или вы хотите видеть значения до завершения потока.

0

Вы также можете использовать collect оператор:

ArrayList list = observable.collect(ArrayList::new, ArrayList::add) 
           .toBlocking() 
           .single(); 

С collect, вы можете выбрать, какой тип Collection вы предпочитаете, и выполнить дополнительную работу по данному вопросу, прежде чем добавить его в список.

+2

Сбор мог быть написан с использованием ссылок на методы как 'collect (ArrayList :: new, ArrayList :: add)' – Will

+0

Спасибо за советы, пропустили использование ссылок на методы здесь , – araknoid

Смежные вопросы