Lambda
目录
1.Lambda表达式简介
2.Lambda表达式的作用
3.Lambda表达式的语法
4.函数式接口
5.Lambda表达式的举例
Lambda表达式简介
Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数作为一个方法的参数,即行为参数化,函数作为参数传递进方法中。
Lambda表达式可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
Lambda表达式的作用
Java 8 引入的 Lambda表达式的主要作用就是简化代码,写出更优雅的代码。
怎么一个简化优雅呢,举一Lambda语法创建线程和匿名内部类创建线程的例子,就非常清楚了。
1.匿名类创建线程
2.Lambda表达式创建线程
上述代码跟匿名内部类的作用是一样的,但比匿名内部类更进一步,这里连接口名和函数名都一同省掉了,Lambda表达式可以取代匿名内部类,写出更优雅的代码。
Lambda表达式的语法
lambda 表达式的语法格式如下:
- *():**左侧部分指定了Lambda表达式需要的所有参数。
- >:Lambda表达式的操作符或者箭头操作符。
- {}:右侧部分指定了Lambda体,即方法需要实现的内容。
1.无参数
Lambda体只有一条语句:
示例:
请注意,括号中没有内容。那就是表示lambda不带任何参数。
2.一个参数
示例:
当lambda表达式是单个参数时,也可以省略括号,如下所示:
3.多个参数
如果Java lambda表达式匹配的方法有多个参数,则需要在括号内列出这些参数,代码如下:
注意:仅当方法是单个参数时,才可以省略括号。
4.指定参数类型
如果编译器无法从lambda匹配的函数式接口抽象方法推断参数类型,则有时可能需要为lambda表达式指定参数类型。
如你所见,car参数的类型(Car)写在参数名称的前面,就像在其他方法中声明参数或对接口进行匿名实现时一样。
5.只有一条语句时
当Lambda体只有一条语句时,return和大括号可以省略,示例:
6.参数类型不写
Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器能够通过上下文推断出数据类型,这就是“类型推断”,示例:
等同于
上述 Lambda 表达式中的参数类型都是由编译器推断得出,Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。
Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的,这就是所谓的“类型推断”。
7.Lambda表达式返回值
你可以从Java lambda表达式返回值,就像从方法中返回值一样。你只需向lambda表达式主体添加一个return,如下所示:
函数式接口
Lambda表达式需要函数式接口的支持,所以,我们有必要来说说什么是函数式接口。
一种用于表示一个接口是Java语言规范定义的函数式接口的注解类型。
对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方。
为了确保函数式接口的正确性,我们可以给这个接口添加@FunctionalInterface注解,这样当其中有超过一个抽象方法时就会报错。
Java 8中每一个Lambda表达式必须有一个函数式接口与之对应,也就是说,只要一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式来表示。
Lambda表达式的举例
学习 Lambda 表达式的最好方式是学习例子,下面我们看几个比较常用的例子。
1.lambda创建线程
使用() -> {} 替代匿名类:
2.lambda事件处理
使用lambda表达式如下所示写出更好的事件侦听器的代码:
3.lambda遍历List集合
集合的遍历,采用lambda表达式会更简洁:
方法引用是使用两个冒号::这个操作符号。
4.元素排序
之前我们若要为集合内的元素排序,就必须调用 sort 方法,传入比较器重写 compare。
方法的比较器对象,现在我们还可以使用 lambda 表达式来简化代码。
5.lambda Map
6.lambda过滤String
7.lambda对集合应用函数
8.lambda计算最大值、最小值、平均值
以上就是Java 8的lambda表达式的详解,希望对你有所用!
Loading...