2017.5.4
2017.5.5
2017.5.11
2017.5.12
- [x] 拉模式和推模式,命令式和响应式 – 响应式编程 [Android RxJava2](这到底是什么):第二部分
- 观察者模式和回调方法有一个区别。在观察者模式中,每个订阅了的人都会通知,而回调方法中,只有一个最后订阅的回调会被通知。
- [x] 函数式接口、默认方法、纯函数、函数的副作用、高阶函数、可变的和不可变的、函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava 2](这到底是什么)第三部分
- 如果接口定义默认方法或者继承并重写 java.lang.Object 类里的任何方法。那个接口还是函数式接口,这是因为 java.lang.Object 方法并不算数。
- 只要记住函数式接口的三点原则:只有一个抽象方法 - 可以有默认方法 - 可以使用 java.lang.Object 方法。如果任何接口满足这三点,那就一定是有效的函数式接口,反之则不是。
- 拥有至少一个函数类型为参数的函数,或着返回一个函数的函数叫做高阶函数。
- 函数式接口 - 有且仅有一个抽象方法的接口。
- 默认方法 - 在 Java 8 里,我们可以在接口中定义有方法体的方法,这些叫默认方法。
- 纯函数 - 一个函数的返回值仅由输入值决定,没有明显可见的副作用。
- Lambda 表达式: “在计算机编程中,lambda 表达式,也叫匿名函数,是指一类无需定义标识符(函数名)的函数或子程序。”(Wiki)
- 任何以函数式接口为参数的方法,我就可以写成 Lambda 表达式
- [x] 大战 RxJava2 和 Java8 Stream [ Android RxJava2 ] (这到底是什么) 第四部分
函数式接口(Functional Interfaces)、 接口默认方法(Default Methods)、高阶函数(Higher Order Functions)、函数的副作用(Side Effects in Functions)、纯函数(Pure Functions)、Lambda 表达式和函数式编程。
函数式接口是只有一个抽象方法的接口。
在 Java8 我们可以在接口中定义方法,这种方法叫做“默认方法”。
至少有一个参数是函数的函数和返回类型为函数的函数称为高阶函数。
纯函数的返回值仅仅由参数决定,不会产生可见的副作用(比如修改一些影响程序状态的值。——译注)。
Lambda 表达式在计算机编程中又叫做匿名函数,是一种在声明和执行的时候不会跟标识符绑定的函数或者子程序。
filter(过滤器): Stream 有一个只接受 Predicate 这个函数式接口的方法。我们可以在 Predicate 里写作用在数据上的逻辑代码。
map(映射):Stream 有一个只接受 Function 这个函数式接口的方法。我们可以在 Function 里写按照我们的要求转换数据的逻辑代码。
如何把命令式代码转化成 RxJava2 Android 代码(重要)
-
几个关于把命令式代码转换成响应式代码的技巧
- 如果代码中有循环的话,用 Observable 替换
for (int i = 0; i < 10; i++) { } ==> Observable.range(0,10);
- 如果代码中有 if 语句的话,用 Rx 中的 filter 替换
for (int i = 0; i < 10; i++) { if(i%2==0){ Log.i("Android", "Even"); } } ==> Observable.range(0,10) .filter(i->i%2==0) .subscribe(value->Log.i("Android","Event :"+value));
- 如果需要把一些数据转换为另一种格式,可以用 map 实现
public class User { String username; boolean status; public User(String username, boolean status) { this.username = username; this.status = status; } } List<User> users = new ArrayList<>(); users.add(new User("A",false)); users.add(new User("B",true)); users.add(new User("C",true)); users.add(new User("D",false)); users.add(new User("E",false)); for (User user : users) { if(user.status){ user.username = user.username+ "Online"; }else { user.username = user.username+ "Offline"; } }
在 Rx 中,有很多方法实现上述代码。
使用两个流:
Observable.fromIterable(users) .filter(user -> user.status) .map(user -> user.username + " Online") .subscribe(user -> Log.i("Android", user.toString())); Observable.fromIterable(users) .filter(user -> !user.status) .map(user -> user.username + " Offline") .subscribe(user -> Log.i("Android", user.toString()));
在 map 中使用 if else :
Observable.fromIterable(users) .map(user -> { if (user.status) { user.username = user.username + " Online"; } else { user.username = user.username + " Offline"; } return user; }) .subscribe(user -> Log.i("Android", user.toString()));
- 如果代码中有嵌套的循环:
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.print("j "); } System.out.println("i"); } ==> Observable.range(0, 10) .doAfterNext(i-> System.out.println("i")) .flatMap(integer -> Observable.range(0, 10)) .doOnNext(i -> System.out.print("j ")) .subscribe();
- [x] 开发者(也就是我)与Rx Observable 类的对话 [ Android RxJava2 ] ( 这到底是什么?) 第五部分