前言
將觀察序列的元素值就行篩選的操作
Filtering and Conditional Operators
-
filter
將符合條件的元素值根據條件進行篩選
example("filter") {
let disposeBag = DisposeBag()
Observable.of(
"??", "??", "??",
"??", "??", "??",
"??", "??", "??")
.filter {
$0 == "??"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- filter example ---
??
??
??
-
distinctUntilChanged
去掉序列中重復的事件元素,相鄰元素如果相同的話,進保留一個,如果不是相鄰的元素不做去重元素
example("distinctUntilChanged") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??", "??")
.distinctUntilChanged()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- distinctUntilChanged example ---
??
??
??
??
??
-
elementAt
篩選出序列中指定索引的元素
example("elementAt") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.elementAt(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- elementAt example ---
??
-
single
分兩種情況篩選,當single后面不帶條件的時候,則默認篩選第一個元素拋出;single后面帶條件就根據條件進行進行篩選,如果元素不是唯一一個或者沒有符合條件的元素將拋出錯誤
/*********single 不帶條件***********/
example("single") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.single()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- single example ---
??
/*********single 帶條件***********/
example("single with conditions") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.single { $0 == "??" }
.subscribe { print($0) }
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- single with conditions example ---
next(??)
completed
/*********single 帶條件,篩選值不唯一***********/
example("single with conditions") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.single { $0 == "??" }
.subscribe { print($0) }
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- single with conditions example ---
next(??)
error(Sequence contains more than one element.)
/*********single 帶條件,篩選值沒有的情況 *****/
example("single with conditions") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.single { $0 == "??" }
.subscribe { print($0) }
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- single with conditions example ---
error(Sequence doesn't contain any elements.)
-
take
僅從可觀察序列的開頭發出指定數量的元素
example("take") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.take(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- take example ---
??
??
??
-
takeLast
僅從可觀察序列的結尾倒數發出指定數量的元素
example("takeLast") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.takeLast(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
example("takeLast") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.takeLast(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
-
takeWhile
僅從可觀察序列的開頭篩選出指定條件的元素
example("takeWhile") {
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 5, 6)
.takeWhile { $0 < 4 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- takeWhile example ---
1
2
3
-
takeUntil
A序列元素等到B序列元素發出元素以后再發出,A序列的事件發送完以后就發發送Complete,B序列無論是否發出新的事件元素以后A序列都不再發出事件元素
example("takeUntil") {
let disposeBag = DisposeBag()
let sourceSequence = PublishSubject<String>()
let referenceSequence = PublishSubject<String>()
sourceSequence
.takeUntil(referenceSequence)
.subscribe { print($0) }
.disposed(by: disposeBag)
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
referenceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
}
// 控制臺打印的結果:
--- takeUntil example ---
next(??)
next(??)
next(??)
completed
-
skip
和take作用相反,僅從可觀察序列的開頭禁止發出或者排除指定數量的元素
example("skip") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.skip(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- skip example ---
??
??
??
??
-
skipWhile
和takeWhile相反,僅從可觀察序列的開頭排除出指定條件的元素
example("skipWhile") {
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 5, 6)
.skipWhile { $0 < 4 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- skipWhile example ---
4
5
6
-
skipWhileWithIndex
根據索引的條件排除相應的元素
example("skipWhileWithIndex") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.skipWhileWithIndex { element, index in
index < 3
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺打印的結果:
--- skipWhileWithIndex example ---
??
??
??
-
skipUntil
和takeUntil相反,A序列事件元素,排除在B序列發出事件元素之前的時間元素,保留B序列發出元素之后的A的事件元素
example("skipUntil") {
let disposeBag = DisposeBag()
let sourceSequence = PublishSubject<String>()
let referenceSequence = PublishSubject<String>()
sourceSequence
.skipUntil(referenceSequence)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
referenceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
}
// 控制臺打印的結果:
--- skipUntil example ---
??
??
??