一文打通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


相关文章
|
存储 Java
Java堆和栈的区别和介绍以及JVM的堆和栈
Java堆和栈的区别和介绍以及JVM的堆和栈 一、Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存。 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。
6034 0
|
负载均衡 Java API
SpringCloud之OpenFeign介绍案例+相关面试题
OpenFeign是一个声明式的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时提供负载均衡的HTTP客户端Feign是一个远程调用的组件集成了Ribbon,默认的负载均衡策略是轮询
995 0
|
12月前
|
消息中间件 存储 算法
RocketMQ核心知识点整理,收藏再看!
RocketMQ核心知识点整理,收藏再看!
1105 0
RocketMQ核心知识点整理,收藏再看!
|
11月前
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
332 63
|
12月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
764 0
Java面试题之cpu占用率100%,进行定位和解决
|
12月前
|
Java 数据处理
|
12月前
|
Java
Java中抽象类和接口有什么区别?
本文阐述了Java中抽象类和接口的区别,包括类型扩展、方法/属性访问控制符、方法实现、使用目的等方面的不同,并提供了抽象类和接口的使用示例,以及Java中其他类型的类(普通类、内部类等)的简介。
1644 0
Java中抽象类和接口有什么区别?
|
存储 关系型数据库 MySQL
PostgreSQL与MySQL优劣势比较浅谈
PostgreSQL与MySQL优劣势比较浅谈
1744 0
|
消息中间件 存储 Kafka
MQ保证消息幂等机制
MQ保证消息幂等机制
488 0
|
12月前
|
消息中间件 NoSQL 关系型数据库
一文彻底搞定Redis与MySQL的数据同步
【10月更文挑战第21天】本文介绍了 Redis 与 MySQL 数据同步的原因及实现方式。同步的主要目的是为了优化性能和保持数据一致性。实现方式包括基于数据库触发器、应用层双写和使用消息队列。每种方式都有其优缺点,需根据具体场景选择合适的方法。此外,文章还强调了数据同步时需要注意的数据一致性、性能优化和异常处理等问题。
2437 0