与小清新的距离 你只差一个RxKotlin !_java


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, 返回的rsponsedata 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,前两者在移动平台上开发也不再是什么新鲜事了,那么其他的家族成员是否也会受到大家的热宠呢,让我们拭目以待!