面试题分享——Lambda表达式和常用的函数式接口
一. 什么是Lambda表达式
Lambda表达式是JDK1.8中新增的一种方式,用于替代匿名内部类,该表达式可以让开发人员更加关注于具体需要传递的方法,而不是因为需要传递一个方法而创建一个对象。
二. Lambda表达式
基本语法
Lambda省去⾯向对象的条条框框,格式由3个部分组成:
- 参数部分
- 箭头
- 代码块
比如:(参数类型 参数名称) -> { 代码语句 }
格式说明
- ⼩括号内的语法与传统⽅法参数列表⼀致:⽆参数则留空;多个参数则⽤逗号分隔;
- -> 是新引⼊的语法格式,代表指向动作;
- ⼤括号内的语法与传统⽅法体要求基本⼀致。
Lambda的省略格式
所谓的Lambda表达式的省略原则是:可推导即可省略。
Lambda强调的是“做什么”⽽不是“怎么做”,所以凡是可以根据上下⽂推导得知的信息,都可以省略。
3.1 省略规则
在Lambda标准格式的基础上,使⽤省略写法的规则为:
小括号内参数的类型可以省略;
如果小括号内有且仅有一个参,则⼩括号可以省略;
如果大括号内有且仅有一个语句,则⽆论是否有返回值,都可以省略⼤括号、return关键字及语句、分号。
Lambda的使用前提
Lambda的语法非常简洁,完全没有面向对象复杂的束缚,但是使用时有一个问题需要特别注意:
使用Lambda必须具有接⼝,且要求接⼝中有且仅有⼀个抽象⽅法。 ⽆论是JDK内置的
Runnable 、 Comparator 接⼝还是自定义的接⼝,只有当接口中的抽象⽅法存在且唯一时,才可
以使用Lambda。
使用Lambda必须具有上下⽂推断。 也就是⽅法的参数或局部变量类型必须为Lambda对应的接⼝
类型,才能使用Lambda作为该接⼝的实例。
常用函数式接口
JDK提供了⼤量常⽤的函数式接⼝以丰富Lambda的典型使⽤场景,它们主要在 java.util.function
包中被提供. 常用的函数式接口包括以下四个。
5.1 Supplier接⼝
java.util.function.Supplier接⼝仅包含⼀个⽆参的⽅法: T get() 。⽤来获取⼀个泛型参数,可以指定类型的对象数据。由于这是⼀个函数式接⼝,这也就意味着对应的Lambda表达式需要“对外提供”⼀个符合泛型类型的对象数据。
5.1.1 基本使用方式如下:
5.2 Consumer接⼝
java.util.function.Consumer接⼝则正好与Supplier接⼝相反,它不是生产一个数据,一是消费一个数据,其数据类型由泛型决定。
Consumer 接⼝中包含抽象方法 void accept(T t) ,意思是说消费一个执广泛型的数据
Consumer 接⼝中包含默认方法:andThen
如果一个方法的参数和返回值全都是 Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作, 然后再做另⼀个操作,实现组合。用这个方法就是 Consumer 接口中的default方法 andThen
5.2.1 下面是JDK的源代码:
5.3 Predicate接⼝
有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使
⽤java.util.function.Predicate接⼝。
Predicate 接⼝中包含一个抽象方法: boolean test(T t)
该接口也存在三个默认的方法,分别是and 、 or 和negate, 分别表示与 、或 、非三种逻辑处理。
5.3.1 接口代码示例:
5.4 Function接⼝
java.util.function.Function<t,r>接⼝⽤来根据⼀个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。
Function 接⼝中最主要的抽象⽅法是: R apply(T t) ,根据类型T的参数获取类型R的结果。
Function接⼝中有一个默认的andThen方法,来进行组合操作。
5.4.1 基本使用方式如下
相关推荐HOT
更多>>如何添加Java环境变量?
要添加Java环境变量,可以按照以下步骤:并安装Java开发工具包(JDK)、找到Java安装路径、设置JAVA_HOME环境变量、添加Java可执行文件路径到PATH...详情>>
2023-05-04 11:00:56从零开始学Java之String字符串的编码
对很多小白来说,可能不明白什么是字符编码,也不知道为什么要有字符编码,所以先来给大家简要地介绍一下字符编码。详情>>
2023-05-04 10:21:02新手速来!几步带你掌握MyBatis Plus
Mybatis-Plus(简称MP)是一款Mybatis的增强工具,它是在Mybatis的基础上实现的简化开发工具。Mybatis-Plus给我们提供了开箱即用的CRUD操作、自动...详情>>
2023-04-28 10:57:09学习java需要什么基础?基础知识有哪些?
网络编程:了解基本的网络编程概念和协议,熟悉 Java 网络编程 API。建议在学习 Java 之前,先学习一些基础的编程语言,如 C 或 Python 等,这...详情>>
2023-04-28 10:41:14