Map 操作符将您选择的函数应用于源 Observable 发射的每个项目,并返回一个 Observable,该 Observable 发射这些函数应用的结果。
map
keep keep-indexed map map-indexed
待定
byLine cast encode map
RxGroovy 将此操作符实现为 map。例如,以下代码将一个平方传入值的函数映射到 numbers 中的值
numbers
numbers = Observable.from([1, 2, 3, 4, 5]); numbers.map({it * it}).subscribe( { println(it); }, // onNext { println("Error: " + it.getMessage()); }, // onError { println("Sequence complete"); } // onCompleted );
1 4 9 16 25 Sequence complete
此操作符默认情况下不会对任何特定 Scheduler 进行操作。
map(Func1)
cast 操作符是 Map 的一个专用版本,它通过将源 Observable 的每个项目转换为特定类,然后重新发射来转换每个项目。
cast
cast(Class)
在 StringObservable 类(不是 RxGroovy 核心的一部分)中,还有一个专门的映射操作符 encode,它将发射字符串的 Observable 转换为发射字节数组的 Observable,这些字节数组尊重原始字符串中多字节字符的字符边界。
StringObservable
encode
同样在 StringObservable 类(不是 RxGroovy 核心的一部分)中,还有一个专门的映射操作符称为 byLine,它将发射字符串的 Observable 转换为发射文本行的 Observable,方法是缓冲来自源 Observable 的字符串,直到在其中一个字符串中找到换行符。
byLine
RxJava 将此操作符实现为 map。
在 StringObservable 类(不是 RxJava 核心的一部分)中,还有一个专门的映射操作符 encode,它将发射字符串的 Observable 转换为发射字节数组的 Observable,这些字节数组尊重原始字符串中多字节字符的字符边界。
同样在 StringObservable 类(不是 RxJava 核心的一部分)中,还有一个专门的映射操作符称为 byLine,它将发射字符串的 Observable 转换为发射文本行的 Observable,方法是缓冲来自源 Observable 的字符串,直到在其中一个字符串中找到换行符。
cast map
map pluck select
RxJS 将此操作符实现为 map 或 select(两者是同义词)。除了转换函数之外,您还可以传递此操作符一个可选的第二个参数,该参数将成为转换函数执行的“this”上下文。
select
this
转换函数接受三个参数
// Using a value var md = Rx.Observable.fromEvent(document, 'mousedown').map(true); var mu = Rx.Observable.fromEvent(document, 'mouseup').map(false); // Using a function var source = Rx.Observable.range(1, 3) .select(function (x, idx, obs) { return x * x; }); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 1 Next: 4 Next: 9 Completed
还有一个名为 pluck 的操作符,它是此操作符的简化版本。它通过从这些元素中提取单个命名属性,并将其替换为该属性,来转换源 Observable 发射的元素。
pluck
var source = Rx.Observable .fromArray([ { value: 0 }, { value: 1 }, { value: 2 } ]) .pluck('value'); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 0 Next: 1 Next: 2 Completed
map/select 和 pluck 位于以下每个发行版中
rx.js
rx.all.js
rx.all.compat.js
rx.compat.js
rx.lite.js
rx.lite.compat.js
Rx.helpers.pluck(property)
Cast Select
map mapWithIndex mapTo select pluck
RxPHP 将此操作符实现为 map。
接受一个对每个元素进行操作的转换函数。
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/map/map.php $observable = \Rx\Observable::fromArray([21, 42]); $observable ->map(function ($elem) { return $elem * 2; }) ->subscribe($stdoutObserver);
Next value: 42 Next value: 84 Complete!
RxPHP 还有一个操作符 mapWithIndex。
mapWithIndex
Map 操作符变体,它使用索引和值调用 map 选择器
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/map/mapWithIndex.php $subscriptions = Rx\Observable::fromArray([21, 42]) ->mapWithIndex(function ($index, $elem) { return $index + $elem; }) ->subscribe($stdoutObserver);
Next value: 21 Next value: 43 Complete!
RxPHP 还有一个操作符 mapTo。
mapTo
每次将每个值映射到相同的值
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/map/mapTo.php $subscription = Rx\Observable::fromArray([21, 42]) ->mapTo(1) ->subscribe($stdoutObserver);
Next value: 1 Next value: 1 Complete!
RxPHP 还有一个操作符 select。
Map 的别名
RxPHP 还有一个操作符 pluck。
返回一个 Observable,其中包含 Observable 序列中所有元素的指定数组索引(如果为数组)或属性(如果为对象)的值。如果无法解析属性,则 Observable 将会出错。
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/pluck/pluck.php $source = Rx\Observable::fromArray([ (object)['value' => 0], (object)['value' => 1], (object)['value' => 2] ]) ->pluck('value'); $subscription = $source->subscribe($stdoutObserver);
Next value: 0 Next value: 1 Next value: 2 Complete!
map map_with_index
map mapWithIndex