Map 操作符将您选择的函数应用于源 Observable 发射的每个项目,并返回一个 Observable,该 Observable 发射这些函数应用的结果。
map待定
RxGroovy 将此操作符实现为 map。例如,以下代码将一个平方传入值的函数映射到 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(Class)
在 StringObservable 类(不是 RxGroovy 核心的一部分)中,还有一个专门的映射操作符 encode,它将发射字符串的 Observable 转换为发射字节数组的 Observable,这些字节数组尊重原始字符串中多字节字符的字符边界。
同样在 StringObservable 类(不是 RxGroovy 核心的一部分)中,还有一个专门的映射操作符称为 byLine,它将发射字符串的 Observable 转换为发射文本行的 Observable,方法是缓冲来自源 Observable 的字符串,直到在其中一个字符串中找到换行符。
RxJava 将此操作符实现为 map。
此操作符默认情况下不会对任何特定 Scheduler 进行操作。
map(Func1)
cast 操作符是 Map 的一个专用版本,它通过将源 Observable 的每个项目转换为特定类,然后重新发射来转换每个项目。
cast(Class)
在 StringObservable 类(不是 RxJava 核心的一部分)中,还有一个专门的映射操作符 encode,它将发射字符串的 Observable 转换为发射字节数组的 Observable,这些字节数组尊重原始字符串中多字节字符的字符边界。
同样在 StringObservable 类(不是 RxJava 核心的一部分)中,还有一个专门的映射操作符称为 byLine,它将发射字符串的 Observable 转换为发射文本行的 Observable,方法是缓冲来自源 Observable 的字符串,直到在其中一个字符串中找到换行符。
RxJS 将此操作符实现为 map 或 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 发射的元素。
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.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.lite.compat.jsRx.helpers.pluck(property) 来自 Dennis Stoyanov 的 RxJS 书籍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。
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。
每次将每个值映射到相同的值
//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!
待定