文章标题
2017-02-26 22:17
106 查看
RxJava学习之旅(一)
函数接口与lambda表达式
博主是Android小鲜肉一枚,最近在研究学习备受Adroid关注的Rx系列知识,想把学习过程和各位大神一起交流探讨。一、函数接口
Java8新引入的概念。它的定义是:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。接口函数要重定义方法才能被调用,调用函数可理解为已经重写方法的接口函数。lambda正是在这种基础上的一种表达式,它大大简化了我们代码的书写。
二、lambda表达式
Lambda表达式是Java SE 8中一个重要的新特性,所以使用lambda必须先安装JDK8啦。lambda表达式允许你通过表达式来代替功能接口,基本语法:(parameters) -> expression
或
(parameters) ->{ statements; }
例:(int x, int y) -> x + y //接收两个参数,返回他们的值
(String s) -> System.out.print(s) //接收一个字符串并在控制台打印
看到这个有没有觉得很熟悉?记得在JNI中的C语言编写中就是这种语法
老版本Java中是排列字符串的
List<String> names = Arrays.asList("a", "b", "c", "d"); Collections.sort(names, new Comparator<String>() { @Override public int compare(String a, String b) { return b.compareTo(a); } });
只需要给 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常我们都是创建一个匿名的比较器对象然后将其传递给sort方法。
在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
Collections.sort(names, (String a, String b) -> { return b.compareTo(a); });
代码变得更段且更具有可读性,但是实际上还可以写得更短:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:
代码如下:
Collections.sort(names, (a, b) -> b.compareTo(a));
Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。
Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
今天就到这里啦,未完待后续