函数式编程是一种编程范式。我们常见的编程范式有命令式编程、函数式编程和逻辑式编程。我们常见的面向对象编程是一种命令式编程。命令式编程是面向计算机硬件的抽象,有变量、赋值语句、表达式和控制语句。而函数式编程是面向数学的抽象,将计算描述为一种表达式求值,函数可以在任何地方定 义,并且可以对函数进行组合。
响应式编程是一种面向数据流和变化传播的编程范式,数据更新是相关联的。把函数式编程里的一套思路和响应式编程合起来就是函数响应式编程。
函数响应式编程可以极大地简化项目,特别是处理嵌套回调的异步事件、复杂的列表过滤和变换或者 时间相关问题。在 Android 开发中使用函数响应式编程的主要有两大框架:一个是RxJava,另一个是Goodle 推出的Agera。
8.1 RxJava基本用法
8.1.1 RxJava概述
1.ReactiveX与RxJava
RxJava是ReactiveX的一种Java实现。 Rx是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序。开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流,用Schedulers参数化异步数据流的并发处理。
2.为何要用RxJava
RxJava的原理就是创建一个Observable对象,然后使用各种操作符建立起来的链式操作,就如同流水线一样,把你想要处理的数据一步一步地加工成你想要的成品,然后发射给Subscriber处理。
3.RxJava与观察者模式
RxJava的异步操作是通过扩展的观察者模式来实现的。RxJava有4个角色Observable、Observer、Subscriber和Suject。Observable和 Observer 通过subscribe方法实现订阅关系,Observable就可以在需要的时候通知Observer。
8.1.2 RxJava基本实现
RxJava的基本用法分为如下3个步骤。
- 创建Observer(观察者)
onCompleted
onError
onNext
- 创建 Observable(被观察者)
create
just
from
- Subscribe(订阅)
8.1.3 RxJava的不完整定义回调
8.2 RxJava的Subject
Subject 既可以是一个 Observer 也可以是一个 Observerable,它是连接 Observer 和Observerable的桥梁。
- PublishSubject
- BehaviorSubject
- ReplaySubject
- AsyncSubject
8.3 RxJava操作符入门
8.3.1 创建操作符
interval
按固定时间间隔发射整数序列range
发射指定范围的整数序列repeat
重复发射特定数据
8.3.2 变换操作符
变换操作符的作用是对Observable发射的数据按照一定规则做一些变换操作,然后将变换后的数据发射出去。
map
变换flatMap
集合变换cast
转换concatMap
连续变换flatMapIterable
buffer
缓存x个groupBy
分组
8.3.3 过滤操作符
过滤操作符用于过滤和选择Observable发射的数据序列,让Observable只返回满足我们条件的数据。
filter
过滤elementAt
第x个distinct
去重skip
跳过take
只取x个ignoreElements
忽略throttleFirst
发射第一个throttleWithTimeOut
超时限流
8.3.4 组合操作符
组合操作符可以同时处理多个Observable来创建我们所需要的Observable。
startWith
插入数据merge
合并concat
顺序合并zip
合并combineLastest
8.3.5 辅助操作符
delay
延迟Do
添加回调- doOnEach
- doOnNext
- doOnSubscribe
- doOnUnsubscribe
- doOnCompleted
- doOnError
- doOnTerminate
- finallyDo
subscribeOn
observeOn
指定线程timeout
超时
8.3.6 错误处理操作符
RxJava在错误出现的时候就会调用Subscriber的onError方法将错误分发出去,由Subscriber自己来处理错 误。
catch
- onErrorReturn
- onErrorResumeNext
- onExceptionResumeNext
retry
8.3.7 条件操作符和布尔操作符
条件操作符和布尔操作符可用于根据条件发射或变换Observable,或者对它们做布尔运算。
- 条件操作符有
amb
、defaultIfEmpty
、skipUntil
、skipWhile
、takeUntil
和takeWhile
等; - 布尔操作符有
all
、contains
、isEmpty
、exists
和sequenceEqual
。
8.3.8 转换操作符
转换操作符用来将 Observable 转换为另一个对象或数据结构。转换操作符有 toList
、toSortedList
、toMap
、toMultiMap、getIterator和nest等。
8.4 RxJava的线程控制
1.内置的Scheduler
如果我们不指定线程,默认是在调用subscribe方法的线程上进行回调的。如果我们想切换线程,就需要使用Scheduler。RxJava 已经内置了如下5个Scheduler。
- Schedulers.immediate():直接在当前线程运行,它是timeout、timeInterval和timestamp操作符的默认调度器。
- Schedulers.newThread():总是启用新线程,并在新线程执行操作。
- Schedulers.io():I/O操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。
- Schedulers.computation():计算所使用的 Scheduler,例如图形的计算。
- Schedulers.trampoline():当我们想在当前线程执行一个任务时,并不是立即时,可以用trampoline()将它入队。
- AndroidSchedulers.mainThread():RxAndroid库中提供的Scheduler,它指定的操作在主线程中运行。
2.控制线程
在RxJava中用subscribeOn和observeOn操作符来控制线程。