Map

通过对每个项目应用函数来转换 Observable 发射的项目

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 进行操作。

cast

cast 操作符是 Map 的一个专用版本,它通过将源 Observable 的每个项目转换为特定类,然后重新发射来转换每个项目。

encode

StringObservable 类(不是 RxGroovy 核心的一部分)中,还有一个专门的映射操作符 encode,它将发射字符串的 Observable 转换为发射字节数组的 Observable,这些字节数组尊重原始字符串中多字节字符的字符边界。

byLine

同样在 StringObservable 类(不是 RxGroovy 核心的一部分)中,还有一个专门的映射操作符称为 byLine,它将发射字符串的 Observable 转换为发射文本行的 Observable,方法是缓冲来自源 Observable 的字符串,直到在其中一个字符串中找到换行符。

map

RxJava 将此操作符实现为 map

此操作符默认情况下不会对任何特定 Scheduler 进行操作。

cast

cast 操作符是 Map 的一个专用版本,它通过将源 Observable 的每个项目转换为特定类,然后重新发射来转换每个项目。

encode

StringObservable 类(不是 RxJava 核心的一部分)中,还有一个专门的映射操作符 encode,它将发射字符串的 Observable 转换为发射字节数组的 Observable,这些字节数组尊重原始字符串中多字节字符的字符边界。

byLine

同样在 StringObservable 类(不是 RxJava 核心的一部分)中,还有一个专门的映射操作符称为 byLine,它将发射字符串的 Observable 转换为发射文本行的 Observable,方法是缓冲来自源 Observable 的字符串,直到在其中一个字符串中找到换行符。

map

RxJS 将此操作符实现为 mapselect(两者是同义词)。除了转换函数之外,您还可以传递此操作符一个可选的第二个参数,该参数将成为转换函数执行的“this”上下文。

转换函数接受三个参数

  1. 发射的项目
  2. 该项目在发射项目序列中的索引
  3. 发射该项目的 Observable

示例代码

// 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

还有一个名为 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/selectpluck 位于以下每个发行版中

  • rx.js
  • rx.all.js
  • rx.all.compat.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

另请参阅

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!
    

待定