Rx响应式编程的系列框架中,很多朋友对RxJava是最熟悉的,其实它还有很多同胞。比如:RxKotin, RxSwift,RxPhp, RxGo, RxNet, RxJS...,一想到iOS必定对RxSwift很熟悉, Android开发对RxJava却情有独钟!今天就来涨涨RxKotin的姿势!
Rx 是Reactive Extensions的其中的一个方向,这种面向函数的响应试编程目前已经覆盖Java,android, js, Objiect-c, PHP , .net等。Rx系列最经典基于观察者模式带给大家直观的编程开发体验,受到很多开发者的青睐。 观察者,可观察者对象,如果细分有Schedulers,Flow对象等,Rx很好理解,就四大模块,观察者和被观察对象,他们产生的操作schdulers调度器, 它们两者产生的action的可操作的Flow流,具体细节可参考推荐文章。这种编程习惯带给大家的是掌握一门语言的风格,就可以快速简单的使用另一们语言的魔力,相信这也是未来10年的发展趋势。
RxKotlin
RxKotlin是基于kotlin扩展的rx衍生体,对kotlin无需再普及,这种支持Lambdas语法的简洁姿势,会让代码变得小清新和灵活。可能你已经在java8上体验了一番。
开发者可以用Kotlin将Rxjava变得更加简单,接下来用2.x 先睹为快!
package rx.lang.kotlin
import rx.Observable
fun main(args: Array<String>) {
val list = listOf("Java", "c", "php", ".net", "js")
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!") }
)
}
好 很kotlin! 仔细发现code将选择字符长度大于5的元素,然后打印出来,很好理解。
RxKotlin使用
1 老样子 先是集成
Maven:
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxkotlin</artifactId>
<version>2.x.y</version>
</dependency>
Gradle:
compile 'io.reactivex.rxjava2:rxkotlin:2.y.z'
2 添加到项目中,套路!接着来!
repositories {
maven { url 'https://jitpack.io' }
}
dependencies {
compile 'com.github.ReactiveX:RxKotlin:1.x-SNAPSHOT'}
3结合Retrofit再来看看!
data class SearchResultEntry(val id : String, val latestVersion : String)
data class SearchResults(val docs : List<SearchResultEntry>)
data class SearchResponse(val response : SearchResults)
interface SearchService {
@GET("/solrsearch/data")
fun search(@Query("q") s : String, @Query("rows") rows : Int = 20) : Observable<SearchResponse>
}
fun main(args: Array<String>) {
val service = RestAdapter.Builder().
setEndpoint("http://search.maven.org").
build().
create(MavenSearchService::class.java)
service.search("rxkotlin").
flatMapIterable { it.response.docs }.
doAfterTerminate { System.exit(0) }.
// we need this otherwise Rx's executor service will shutdown a minute after request completion
subscribe { artifact ->
println("${artifact.id} (${artifact.latestVersion})")
}
}
前面三行是定义好我们的model实体,返回bean, 返回的rsponse。data class 是用来声明一个class的,好比c中def,js中var申明变量对象一样。
SearchService
:用过retrofit的也很明白,定义的一个抽象API接口。
定义的接口干啥东东的呢,实际就是查询一下某个库的最新版本。案列查询以“rxkotin”作为参数,通过将返回的数据获取doc文档,接着就进行输出了Ta的maven库ID和Version.
通过这个简单的栗子,发现不管用rxJava, 还是只用retrofit, 通过使用rxkotlin将业务流程变得更加清晰,那么kotlin是否也有他的操作符,当然他也有过滤器,转换器,拆分符和rxjava命名保持一致。如果有兴趣的可以继续去官方github关注。
这里不再具体说明每个API。
写在最后
Rx家族目前最为熟知的是rxjava和rxSwift,前两者在移动平台上开发也不再是什么新鲜事了,那么其他的家族成员是否也会受到大家的热宠呢,让我们拭目以待!
技术 - 资讯 - 感悟
END