前言
** 先看维基百科的解释**
函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
现在函数式编程越来越流行,这种编程方式强调程序执行的结果而非执行的过程。结合MVP设计模式让我们开发变得越来越便捷。
不过东西好是好,对于新手来说入门有些困难。Rxjava入门还是有些时间成本的。Android要实现函数式编程需要引入两个库文件,方式如下:
RxJava
RxAndroid
compile 'io.reactivex:rxjava:x.y.z'
compile 'io.reactivex:rxandroid:1.2.0'
说了半天,到底什么是rxjava呢,初学者肯定一头雾水。简单来说,ReactiveX就是”观察者模式+迭代器模式+函数式编程”,它扩展了观察者模式,通过使用可观察的对象序列流来表述一系列事件,订阅者进行占点观察并对序列流做出反应(或持久化或输出显示等等);借鉴迭代器模式,对多个对象序列进行迭代输出,订阅者可以依次处理不同的对象序列;使用函数式编程思想(functional programming),极大简化问题解决的步骤。
RxJava最核心的两个东西就是Observables(被观察者,也就是事件源)和Subscribers(观察者),由Observables发出一系列的事件,Subscribers进行订阅接收并进行处理,看起来就好像是设计模式中的观察者模式,但是跟观察者模式不同的地方就在于,如果没有观察者(即Subscribers),Observables是不会发出任何事件的。
通俗来讲,Observables就是个事件发射器,将事件发射到Subscribers上进行处理。如果事件不唯一,就会对事件进行轮询处理,如果在此过程中出现异常就直接抛出,事件中断。
说了这么久,对于新手来说依旧没什么印象,反而觉得复杂难懂。下面我们来结合例子说明
编写helloworld
Observable<String> observable = Observable.just("helloworld");
首先我们创建了一个Observable对象,然后将“helloworld”数据传递给他。不过现在observable不会有任何动作,我们刚才说过,没有subscriber对象,Observables是不会发出事件的。
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onCompleted");
}
@Override
public void onNext(String s) {
System.out.println(s);
}
};
现在我们创建了subscriber对象,它是用来处理事件的。subscriber中有三个方法分别是onNext、onError、onCompleted,从这个方法中可以看出,onNext可以多次执行,但在这里我们只有一个数据源,所以只会执行一次,onError在有错误的时候执行,onCompleted在没有任何事件需要处理之后执行。
observable.subscribe(subscriber);
当subscriber订阅observable之后,事件开始发送。在这个过程中我们不关心内部是怎样发送数据的,如果没有异常发出,onNext应该会被调用。
我们运行一下程序
可以看到helloworld输出出来了,一次事件完成。另外,我们还发现onCompleted也被打印了出来。
这里多说一句,当程序出错时是不会调用onCompleted方法的!
打印数组
刚才我们输出了helloworld。有人问,如果是数组呢,或者是List()。Rxjava已经为我们考虑到了。Observable给我们提供了多种初始化方式,最常见的除了just()方式外还有from()
我们从图片中可以看到,构造方法里是各种泛型,我们可以传入类似于数组的参数,比如List Map Array及其子类。
我们再次创建了observable对象,剩下的步骤读者应该知道了吧,这里我直接给出代码
Observable<String> observable = Observable
.from(new String[]{"one", "two", "three", "four"});
observable.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
System.out.println(s);
}
});
06-02 20:51:34.486 28207-28207/? I/System.out: one
06-02 20:51:34.486 28207-28207/? I/System.out: two
06-02 20:51:34.486 28207-28207/? I/System.out: three
06-02 20:51:34.486 28207-28207/? I/System.out: four
今天的文章就到这里,下一章主要讲Rxjava的操作符使用,感兴趣的朋友请继续阅读Rxjava入门二。