您的位置:首页 > 移动开发 > Android开发

文章标题

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表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

今天就到这里啦,未完待后续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java android lambda