2017年4月

RXJava 1.* 中的 flatmap 操作符例子

例子:

Integer[] values = {1, 2, 3, 4, 5}; 
List<Integer> list = Arrays.asList(values); 

Observable.from(list).flatMap(new Func1<Integer, Observable<Integer>>(){
    @Override
    public Observable<Integer> call(Integer t) {
        Integer[] nums = {t, t + t, t * t};
        return Observable.from(nums);
    }
    
}).subscribe((i) -> {System.out.println("what I get is: " + i);});

与map 操作符的主要区别是: map 只是输入一个event,返回另外一个event,flatmap 输入一个event,先返回一个Observable,然后这些返回的Observables 在merge到一个Observable 里面去

Java 变长参数 引起的错误

看下面的代码:

Integer[] values = {1, 2, 3, 4, 5}; 
List<Integer> list = Arrays.asList(values); 
    
int[] numbers = {1, 2, 3, 4, 5};
List<int[]> intList = Arrays.asList(numbers);

为什么第二个变成了 int 数组的 List?看 Arrays.asList的方法:

@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

它的参数是一个变长参数,可以认为是一个数组。 上面例子第一种情况它认为是 Integer数组,里面包含1到5,5个元素,第二种情况,它认为你传入的是int[][], 并且只包含一个元素,那就是int[]. 对于primary 类型,变长参数估计都是这么理解的。

函数式编程与命令式编程的区别 Functional, Imperative Programming

关于 函数式 和 命令式 还是下面这三篇讲的比较好:
http://www.cnblogs.com/lisperl/archive/2011/11/21/2257360.html
http://www.cnblogs.com/lisperl/archive/2011/11/22/2258995.html
http://www.cnblogs.com/lisperl/archive/2011/11/23/2259363.html

个人理解:
现在的大部分语言都是对汇编的封装, 汇编是基于内存,CPU这种物理结构来解决问题的,所以它在运算时,有自己的内部状态,通过一步步的算法修改内部状态,最终得出结果。函数式是基于数学函数的,它对于给定的输入参数,经过函数运算得出输出,它通过函数对函数的调用,最终得到结果。函数式是声明式的一种。
命令式:

int a = 0;
b = a * a + 3;
System.out.println(b);

函数式:

add: (a, b)->{return a + b;};
power: (a)->{return a * a};
println(add(power(a), 3));