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...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP