Android比较器类的rxjavasorting列表

我开始用我的android项目使用rxjava。 我需要从api调用中sorting返回事件列表。 我写了比较类来sorting列表:

public class EventParticipantComparator { public static class StatusComparator implements Comparator<EventParticipant> { @Override public int compare(EventParticipant participant1, EventParticipant participant2) { return participant1.getStatus() - participant2.getStatus(); } } } 

我可以使用这个类与经典的集合类。

 Collections.sort(participants, new EventParticipantComparator.StatusComparator()); 

我怎样才能以反应的方式来实现这种情况? 如果有任何方法asynchronoussorting列表,我会更喜欢这种方式。

没有sorting列表的反应方式:

 dataManager.getEventImplementer().getParticipants(event.getId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<List<EventParticipant>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List<EventParticipant> eventParticipants) { } }); 

如果我没有阅读Collections.sort()的Javadoc,我会推荐像map (list -> Collections.sort (list, comparator))将其转换为有序数组; 这里, map是可观察的映射器。

但是,上面的sort方法是一个就地sortingalgorithm,它会影响底层数组,而不是返回完全sorting的数组。 所以,你应该做这样的事情:

 dataManager.getEventImplementer().getParticipants(event.getId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(unsortedList -> { List<EventParticipant> sortedList = new ArrayList<>(unsortedList.size()); Collections.copy(sortedList, unsortedList); Collections.sort(sortedList, new EventParticipantComparator.StatusComparator()); return sortedList; }) .subscribe(new Subscriber<List<EventParticipant>>() { // ... etc. }); 

这将分别和asynchronous地对每个传入的List<EventParticipant>sorting。

这个解决scheme类似于接受的答案,但使用Rx操作符1)拆分数组到对象2)按实例sorting可比较的实现3)在专用的计算线程上执行;

 dataManager.getEventImplementer().getParticipants(event.getId()) .flatMap(Observable::from) .toSortedList() .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(sortedList -> {...}, error -> {...}); 

请注意,最好使用Schedulers.io进行networking/磁盘写入,Schedulers.computation用于sorting等计算

我假设getParticipants()方法返回Observable<List<EventPartcipant>>

在下面的代码片段中,我首先使用flatMap()运算符将Observable<List<EventPartcipant>>转换为Observable<EventParticipant> 。 这个观测值将一次一个地发送每个EventParticipant 。 现在通过使用toSortedList()运算符,我可以像Comparator<EventParticipant>::compareTo期望的那样,一次处理两个EventParticipant对象。

在其他解决scheme中,sorting操作符应用于.observeOn(AndroidSchedulers.mainThread()) ,这意味着实际的sorting发生在UI线程上。

我修改了这个让API调用在IO调度器上执行,在计算调度器上sorting,最后在UI线程上sorting列表。

 getParticipants().flatMap(new Func1<List<EventParticipant>, Observable<EventParticipant>>() { @Override public Observable<EventParticipant> call(List<EventParticipant> eventParticipants) { return Observable.from(eventParticipants); } }).subscribeOn(Schedulers.io()) .observeOn(Schedulers.computation()) .toSortedList(new Func2<EventParticipant, EventParticipant, Integer>() { @Override public Integer call(EventParticipant eventParticipant, EventParticipant eventParticipant2) { return new StatusComparator().compare(eventParticipant, eventParticipant2); } }).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<List<EventParticipant>>() { @Override public void call(List<EventParticipant> eventParticipants) { // Your sorted list on UI thread. } });