# 算術和聚合操作
## Average
計算原始Observable發射數字的平均值并發射它

`Average`操作符操作符一個發射數字的Observable,并發射單個值:原始Observable發射的數字序列的平均值。
這個操作符不包含在RxJava核心模塊中,它屬于不同的`rxjava-math`模塊。它被實現為四個操作符:`averageDouble`, `averageFloat`, `averageInteger`, `averageLong`。

如果原始Observable不發射任何數據,這個操作符會拋異常:`IllegalArgumentException `。
## Min
發射原始Observable的最小值

`Min`操作符操作一個發射數值的Observable并發射單個值:最小的那個值。
RxJava中,`min`屬于`rxjava-math`模塊。

`min`接受一個可選參數,用于比較兩項數據的大小,如果最小值的數據超過一項,`min`會發射原始Observable最近發射的那一項。

`minBy`類似于`min`,但是它發射的不是最小值,而是發射Key最小的項,Key由你指定的一個函數生成。
## Max
發射原始Observable的最大值

`Max `操作符操作一個發射數值的Observable并發射單個值:最大的那個值。
RxJava中,`max`屬于`rxjava-math`模塊。

`max `接受一個可選參數,用于比較兩項數據的大小,如果最大值的數據超過一項,`max `會發射原始Observable最近發射的那一項。

`maxBy `類似于`max`,但是它發射的不是最大值,而是發射Key最大的項,Key由你指定的一個函數生成。
## Count
計算原始Observable發射物的數量,然后只發射這個值

`Count`操作符將一個Observable轉換成一個發射單個值的Observable,這個值表示原始Observable發射的數據的數量。
如果原始Observable發生錯誤終止,`Count`不發射數據而是直接傳遞錯誤通知。如果原始Observable永遠不終止,`Count`既不會發射數據也不會終止。
RxJava的實現是`count`和`countLong`。
示例代碼
```java
String[] items = new String[] { "one", "two", "three" };
assertEquals( new Integer(3), Observable.from(items).count().toBlocking().single() );
```
* Javadoc: [count()](http://reactivex.io/RxJava/javadoc/rx/Observable.html#count())
* Javadoc: [countLong()](http://reactivex.io/RxJava/javadoc/rx/Observable.html#countLong())
## Sum
計算Observable發射的數值的和并發射這個和

`Sum`操作符操作一個發射數值的Observable,僅發射單個值:原始Observable所有數值的和。
RxJava的實現是`sumDouble`, `sumFloat`, `sumInteger`, `sumLong`,它們不是RxJava核心模塊的一部分,屬于`rxjava-math`模塊。

你可以使用一個函數,計算Observable每一項數據的函數返回值的和。
在`StringObservable`類(這個類不是RxJava核心模塊的一部分)中有一個`stringConcat`操作符,它將一個發射字符串序列的Observable轉換為一個發射單個字符串的Observable,后者這個字符串表示的是前者所有字符串的連接。

`StringObservable`類還有一個`join`操作符,它將一個發射字符串序列的Observable轉換為一個發射單個字符串的Observable,后者這個字符串表示的是前者所有字符串以你指定的分界符連接的結果。
## Concat
不交錯的發射兩個或多個Observable的發射物

`Concat`操作符連接多個Observable的輸出,就好像它們是一個Observable,第一個Observable發射的所有數據在第二個Observable發射的任何數據前面,以此類推。
直到前面一個Observable終止,`Concat`才會訂閱額外的一個Observable。注意:因此,如果你嘗試連接一個"熱"Observable(這種Observable在創建后立即開始發射數據,即使沒有訂閱者),`Concat`將不會看到也不會發射它之前發射的任何數據。
在ReactiveX的某些實現中有一種`ConcatMap`操作符(名字可能叫`concat_all`, `concat_map`, `concatMapObserver`, `for`, `forIn/for_in`, `mapcat`, `selectConcat`或`selectConcatObserver`),他會變換原始Observable發射的數據到一個對應的Observable,然后再按觀察和變換的順序進行連接操作。
`StartWith`操作符類似于`Concat`,但是它是插入到前面,而不是追加那些Observable的數據到原始Observable發射的數據序列。
`Merge`操作符也差不多,它結合兩個或多個Observable的發射物,但是數據可能交錯,而`Concat`不會讓多個Observable的發射物交錯。

RxJava中的實現叫`concat`。
* Javadoc: [concat(Observable<Observable>)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#concat(rx.Observable))
* Javadoc: [concat(Observable,Observable) ](http://reactivex.io/RxJava/javadoc/rx/Observable.html#concat(rx.Observable,%20rx.Observable))
還有一個實例方法叫`concatWith`,這兩者是等價的:`Observable.concat(a,b)`和`a.concatWith(b)`。
## Reduce
按順序對Observable發射的每項數據應用一個函數并發射最終的值

`Reduce`操作符對原始Observable發射數據的第一項應用一個函數,然后再將這個函數的返回值與第二項數據一起傳遞給函數,以此類推,持續這個過程知道原始Observable發射它的最后一項數據并終止,此時`Reduce`返回的Observable發射這個函數返回的最終值。
在其它場景中,這種操作有時被稱為`累積`,`聚集`,`壓縮`,`折疊`,`注射`等。

注意如果原始Observable沒有發射任何數據,`reduce`拋出異常`IllegalArgumentException`。
`reduce`默認不在任何特定的調度器上執行。
* Javadoc: [reduce(Func2)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#reduce(rx.functions.Func2))

還有一個版本的`reduce`額外接受一個種子參數。注意傳遞一個值為`null`的種子是合法的,但是與不傳種子參數的行為是不同的。如果你傳遞了種子參數,并且原始Observable沒有發射任何數據,`reduce`操作符將發射這個種子值然后正常終止,而不是拋異常。
* Javadoc: [reduce(R,Func2)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#reduce(R,%20rx.functions.Func2))
提示:不建議使用`reduce`收集發射的數據到一個可變的數據結構,那種場景你應該使用`collect`。

`collect`與`reduce`類似,但它的目的是收集原始Observable發射的所有數據到一個可變的數據結構,`collect`生成的這個Observable會發射這項數據。它需要兩個參數:
1. 一個函數返回可變數據結構
2. 另一個函數,當傳遞給它這個數據結構和原始Observable發射的數據項時,適當地修改數據結構。
`collect`默認不在任何特定的調度器上執行。
* Javadoc: [collect(Func0,Action2)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#collect(rx.functions.Func0,%20rx.functions.Action2))
- ReactiveX
- Observables
- Single
- Subject
- Scheduler
- Operators
- 創建操作
- Create
- Defer
- Empty/Never/Throw
- From
- Interval
- Just
- Range
- Repeat
- Start
- Timer
- 變換操作
- Buffer
- FlatMap
- GroupBy
- Map
- Scan
- Window
- 過濾操作
- Debounce
- Distinct
- ElementAt
- Filter
- First
- IgnoreElements
- Last
- Sample
- Skip
- SkipLast
- Take
- TakeLast
- 結合操作
- And/Then/When
- CombineLatest
- Join
- Merge
- StartWith
- Switch
- Zip
- 錯誤處理
- Catch
- Retry
- 輔助操作
- Delay
- Do
- Materialize/Dematerialize
- ObserveOn
- Serialize
- Subscribe
- SubscribeOn
- TimeInterval
- Timeout
- Timestamp
- Using
- To
- 條件和布爾操作
- All/Contains/Amb
- DefaultIfEmpty
- SequenceEqual
- SkipUntil/SkipWhile
- TakeUntil/TakeWhile
- 算術和聚合操作
- Average/Concat/Reduce
- Max/Min/Count/Sum
- 異步操作
- 連接操作
- Connect
- Publish
- RefCount
- Replay
- 轉換操作
- 阻塞操作
- 字符串操作
- 按字母順序的操作符列表
- RxJava文檔和教程
- RxJava入門指南
- RxJava使用示例
- 實現自定義操作符
- 自定義插件
- Backpressure
- 錯誤處理
- Android模塊
- 參與開發
- 補充閱讀材料