【Kotlin 反应式编程】第1讲 你好,Reactive Programming

【Kotlin 反应式编程】第1讲 你好,Reactive Programming

1.创建 Gradle Kotlin 项目

image.png

2.传统的命令式编程风格

添加 rxkotlin 依赖

compile group: 'io.reactivex.rxjava2', name: 'rxkotlin', version: '2.2.0'

https://github.com/ReactiveX/RxKotlin

image.png

import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.rxkotlin.toObservable

fun main(args: Array<String>) {

    val list = listOf("Alpha", "Beta", "Gamma", "Delta", "Epsilon")

    list.toObservable() // extension function for Iterables
            .filter { it.length >= 5 }
            .subscribeBy(  // named arguments for lambda Subscribers
                    onNext = { println(it) },
                    onError =  { it.printStackTrace() },
                    onComplete = { println("Done!") }
            )

}

3.传统的命令式编程思维

//命令式编程( Imperative)
fun testImperative1() {
    val x1 = 7
    val flag1 = isOdd(x1)
    println("flagA1:$flag1")

    val x2 = 10
    val flag2 = isOdd(x2)
    println("flagA2:$flag2")
}

fun testImperative2() {
    var x = 7
    val flag = isOdd(x)

    println("flagB1:$flag")

    x = 10
    println("flagB2:$flag")
}

4.函数式编程思维

fun testImperative3() {
    val s = System.currentTimeMillis()
    val flag = { x: Int -> isOdd(x) }

    val t1 = Thread {
        println("flagC1:${flag(7)}")
    }

    val t2 = Thread {
        println("flagC2:${flag(10)}")
    }

    t1.start()
    t2.start()
    t1.join()
    t2.join()

    val t = System.currentTimeMillis()
    println("testImperative3=${t - s}ms")
}

5.使用 RxJava 类库 API

//函数式编程( Functional)
fun testReactive() {
    val s = System.currentTimeMillis()
    val subject: Subject<Int> = PublishSubject.create()
    subject.map { isOdd(it) }.subscribeBy(
            onNext = { println("flagD:$it") },
            onError = { it.printStackTrace() },
            onComplete = { println("Done!") }
    )

//    一种基于异步数据流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一条流合并为一条新的流。
    val t1 = Thread {
        subject.onNext(7)
    }

    val t2 = Thread {
        subject.onNext(10)
    }

    t1.start()
    t2.start()
    t1.join()
    t2.join()

    val t = System.currentTimeMillis()
    println("testReactive=${t - s}ms")
}

三个重要的对象

Observable-数据发送者 Subscriber-订阅者 OnSubscribe-事件

(1)create 函数

val subject: Subject<Int> = PublishSubject.create()

image.png

create 操作符应该是最常见的操作符了,主要用于产生一个 Obserable 被观察者对象,为了方便大家的认知,以后的教程中统一把被观察者 Observable 称为发射器(上游事件),观察者 Observer 称为接收器(下游事件)。

image.png

(2)map 函数

 subject.map { isOdd(it) }.subscribeBy(
            onNext = { println("flagD:$it") },
            onError = { it.printStackTrace() },
            onComplete = { println("Done!") }
    )

一个Observable可能被多个subscriber订阅,而不同的订阅所需要的最终数据不同,但事件的操作逻辑是相同的,就可以利用map来满足不同的数据需求。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hrscy

RxSwift - API

在某些情况,由于不同平台/实现方式,相同的操作符有多个别名,有时相同的操作命名也不一样,有些是因为历史的原因,但是还有一些是因为语言的预留关键字。

1792
来自专栏mathor

Hanoi(汉诺塔)

1302
来自专栏函数式编程语言及工具

FunDA(9)- Stream Source:reactive data streams

    上篇我们讨论了静态数据源(Static Source, snapshot)。这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不...

21110
来自专栏小灰灰

利用Crypto++实现RSA加密算法

之前做一个项目用到crypto++加密库,可以从官网下载对应的源码,其中有一个test.c文件,详细的演示了各种加密算法的使用方法,因此,在其基础上,我将ae...

4497
来自专栏ACM小冰成长之路

DES算法-C/C++实现

闲来无事,车一下轮子,折腾了大半天才搞懂 DESDES 是干毛子的,看了好多博客才弄清楚这个算法的具体原理,真是心累。 只是简单的实现,功能比较简陋,因为参考的...

50010
来自专栏Java与Android技术栈

Transformer 在RxJava中的使用

Transformer,顾名思义是转换器的意思。早在 RxJava1.x 版本就有了Observable.Transformer、Single.Transfor...

9002
来自专栏大内老A

ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身。在某些情况下通过这两者的结...

3716
来自专栏算法+

声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码

上周看到一个变调算法,挺有意思的,原本计划尝试用来润色TTS合成效果的。 实测感觉还需要进一步改进,待有空再思考改进方案。 算法细节原文,移步链接: http:...

60710
来自专栏非典型技术宅

iOS实践:一步步实现星级评分1. 创建星星2. 优化3. 灵异事件

1814
来自专栏不想当开发的产品不是好测试

MD5 in JAVA

using Apache Commons 需要引入org.apache.commons.codec.digest.DigestUtils这个包,pom.xml文...

27910

扫码关注云+社区

领取腾讯云代金券