RxSwift文档翻译5 -- Filtering and Conditional Operators

前言

将观察序列的元素值就行筛选的操作

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 ---
🐸
🐷
🐵

下一节:RxSwift文档翻译6 -- Mathematical and Aggregate Operators

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 1.RxSwift初识 RxSwift是 ReactiveX 的swift版本,是一种函数式响应编程的框架。RxS...
    MrMessy阅读 3,064评论 0 11
  • 原创 2017-06-13 RxSwift 这个框架RP框架相信你应该不陌生了,在Objective-C中我们使用...
    一根聪阅读 6,119评论 4 14
  • 时间:2017.1.23上午10:00 地点:魁玉路开心小镇 绘本来源:第二书房“百城千群万里书香”漂流书包 带领...
    舒颐阅读 256评论 1 2
  • 编译器指令用@开始 @"chars" 实现常量字符串对象@class c1,c2,... 将 c1,c2..声明为...
    OneKeyRestore阅读 211评论 0 0