一文打通Lambda 表达式和函数式接口

简介: 一文打通Lambda 表达式和函数式接口

Lambda 表达式

为什么使用 Lambda 表达式


Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以 传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

从匿名类到 Lambda 的转换举例1

4156b076adb648c698a2f24ae0a5ad81.pngddf7c6e9492147f9b59d9fd3077573c8.png

从匿名类到 Lambda 的转换举例2

ae3851406d174d9984f06fdda873cbb6.png

9e1007a927ab4cbab7ee093689d50f72.png

Lambda 表达式:语法  

Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操 作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:


左侧:指定了 Lambda 表达式需要的参数列表


右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即Lambda 表达式要执行的功能。


常见语法场景

语法格式一:无参,无返回值  


921ee72135ee4c5493a87337dc8c17fc.png


语法格式二:Lambda 需要一个参数,但是没有返回值。  


ed0f1ce3937e49bfb6c7092856ce29a3.png

语法格式二:Lambda 需要一个参数,但是没有返回值。  

3a7ba3aaa4d84bb6bb91e6865ea94378.png

语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略

a17f926c883c4e78a4761d4e4a8b2bc0.png

语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值


fc59d9919bd343c99f2a1e7bffd1b2ff.png

语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略

ad01eb174a974df3b18aa3d688819594.png

类型推断


上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序 的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”


ec250c38f19d4a69961327373ab7e378.png

函数式接口

什么是函数式(Functional)接口

 只包含一个抽象方法的接口,称为函数式接口。

 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式 抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。


 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检 查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。


 在java.util.function包下定义了Java 8 的丰富的函数式接口


如何理解函数式接口


Java从诞生日起就是一直倡导“一切皆对象”,在Java里面面向对象(OOP)编程是一切。但是随着python、scala等语言的兴起和新技术的挑战,Java不 得不做出调整以便支持更加广泛的技术要求,也即java不但可以支持OOP还 可以支持OOF(面向函数编程)


在函数式编程语言当中,函数被当做一等公民对待。在将函数作为一等公民的 编程语言中,Lambda表达式的类型是函数。但是在Java8中,有所不同。在Java8中,Lambda表达式是对象,而不是函数,它们必须依附于一类特别的对象类型——函数式接口。


简单的说,在Java8中,Lambda表达式就是一个函数式接口的实例。这就是Lambda表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口 的实例,那么该对象就可以用


Lambda表达式来表示。


所以以前用匿名实现类表示的现在都可以用Lambda表达式来写


函数式接口举例  


5ff144f73c524d1587318502c48bff43.png


自定义函数式接口

@FunctionalInterface
public interface Myfun <T>{
    public T getValue(T t);
}


作为参数传递 Lambda 表达式


656b08334fad46d2bf6af18e8909685c.png

作为参数传递 Lambda 表达式:  

94834545800341299ea7460a24f6dcd7.png

 作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接收Lambda

表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型。

e213aed37d004494ab2e8d5e82b5dd14.png

c32ee2a4d41442b7ba50e83d27b6d940.png


相关文章
|
14天前
|
Java
Lamda表达式和匿名内部类
Lamda表达式和匿名内部类
13 0
|
2月前
|
存储 JavaScript 前端开发
c++lambda函数与表达式
c++lambda函数与表达式
9 1
|
8月前
|
存储 算法 编译器
C++ lambda 表达式
# C++ `lamdba` 表达式 > Lambda表达式是C++11引入的一个新特性,它允许我们在需要函数对象的地方,使用一种更加简洁的方式定义匿名函数。Lambda表达式通常用于`STL`中的算法、回调函数、事件处理程序等场合。 Lambda表达式的基本语法为: ```c++ Copy Code[capture list](parameter list) mutable exception -> return type { function body } ``` ## `lamdba`表达式在什么场合下使用 C++11 lambda表达式可以用来创建匿名函数,也就是没有函数名的
56 0
|
9月前
|
Java 编译器 API
4.3 Lambda表达式的性能与限制:在某些情况下避免使用Lambda表达
4.3 Lambda表达式的性能与限制:在某些情况下避免使用Lambda表达
645 0
|
9月前
|
存储 Java 开发者
1.1 Lambda表达式的基础:Lambda表达式的定义与语法
1.1 Lambda表达式的基础:Lambda表达式的定义与语法
62 0
|
10月前
|
安全 架构师 Java
必须掌握的 Lambda 表达式
必须掌握的 Lambda 表达式
5859 1
必须掌握的 Lambda 表达式
|
Java
Lambda 表达式Demoo
Lambda 表达式Demoo
99 0
Lambda 表达式Demoo
|
存储 算法 编译器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
|
安全 Java
Lambda、方法引用、函数式接口
Lambda、方法引用、函数式接口
|
并行计算 Java 编译器
Lambda 表达式
Lambda 表达式
146 0
Lambda 表达式