toSortedList
操作符的行为与 toList
非常相似,不同之处在于它会对结果列表进行排序。默认情况下,它会使用 Comparable
接口按升序对列表进行自然排序。如果源 Observable 发射的任何项目都不支持 Comparable
,而该项目的类型与源 Observable 发射的每个项目的类型相同,则 toSortedList
将抛出一个异常。但是,您可以通过将一个函数也传递给 toSortedList
来更改此默认行为,该函数将两个项目作为参数,并返回一个数字;然后,toSortedList
将使用该函数而不是 Comparable
来对项目进行排序。
例如,以下代码将一个无序整数列表转换为 Observable,然后将该 Observable 转换为一个发射原始列表作为单个项目的 Observable,但已排序。
示例代码
numbers = Observable.from([8, 6, 4, 2, 1, 3, 5, 7, 9]);
numbers.toSortedList().subscribe(
{ println(it); }, // onNext
{ println("Error: " + it.getMessage()); }, // onError
{ println("Sequence complete"); } // onCompleted
);
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Sequence complete
这是一个提供自己的排序函数的示例:在本例中,一个根据数字与数字 5 的接近程度对数字进行排序的函数。
numbers = Observable.from([8, 6, 4, 2, 1, 3, 5, 7, 9]);
numbers.toSortedList({ n, m -> Math.abs(5-n) - Math.abs(5-m) }).subscribe(
{ println(it); }, // onNext
{ println("Error: " + it.getMessage()); }, // onError
{ println("Sequence complete"); } // onCompleted
);
[5, 6, 4, 3, 7, 8, 2, 1, 9]
Sequence complete
toSortedList
默认情况下不会在任何特定的 Scheduler 上操作。