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 的每個項目轉換為特定的 Class,然後重新發射它來轉換它們。

encode

在不是 RxGroovy 核心部分的 StringObservable 類別中,還有一個特殊的映射運算子 encode,它將發射字串的 Observable 轉換為發射位元組陣列的 Observable,該位元組陣列尊重原始字串中多位元組字元的字元邊界。

byLine

同樣在不是 RxGroovy 核心部分的 StringObservable 類別中,還有一個名為 byLine 的特殊映射運算子,它透過緩衝來自來源 Observable 的字串,直到在其中一個字串中找到換行符號,將發射字串的 Observable 轉換為發射文字行的 Observable。

map

RxJava 將此運算子實作為 map

預設情況下,此運算子不會在任何特定的 Scheduler 上執行。

cast

cast 運算子是 Map 的特殊版本,它透過將來源 Observable 的每個項目轉換為特定的 Class,然後重新發射它來轉換它們。

encode

在不是 RxJava 核心部分的 StringObservable 類別中,還有一個特殊的映射運算子 encode,它將發射字串的 Observable 轉換為發射位元組陣列的 Observable,該位元組陣列尊重原始字串中多位元組字元的字元邊界。

byLine

同樣在不是 RxJava 核心部分的 StringObservable 類別中,還有一個名為 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

映射運算子變體,該變體使用索引和值呼叫映射選取器

範例程式碼

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

待定