文章目录
- 1 Lambda介绍
- 1.1 什么是Lambda
- 1.2 为什么使用Lambda
- 2 语法标准格式
- 1.1 语法格式
- 1.2 格式说明:
- 1.3 lambda表达式的重要特征
- 1.4 lambda表达式的常见格式
- 1.5 语法格式1
- 1.6 语法格式2
- 1.7 语法格式3
- 1.8 语法格式4
- 1.9 语法格式5
- 1.10 语法格式6
- 3 函数式接口
- 3.1 函数式接口的概念
- 3.2 函数式接口分类
1 Lambda介绍
1.1 什么是Lambda
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包,和传统数学上的意义有区别。
Java 8的引入了Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口
1.2 为什么使用Lambda
可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样进行传递)。Lambda允许把函数作为一个方法的参数,使用Lambda表达式可以写出更简洁、更灵活的代码,而其作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升
2 语法标准格式
1.1 语法格式
Lambda表达式在Java语言中引入了一个操作符 ->,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:
左侧:指定了Lambda表达式需要的所有参数
右侧:制定了Lambda体,即Lambda表达式要执行的功能
- 左侧:一些参数
- 中间:一个箭头
- 右侧:一段代码
Lambda表达式的标准格式如下:
(参数类型 参数名称) -> {代码语句}
参数列表 符号 代码
(parameters) -> expression
(parameters) -> {statements;}
1.2 格式说明:
(参数类型 参数名称) -> {代码语句}
- 小括号内的语法与传统方法列表一致:无参数则留空,多个参数使用逗号隔开
- 符号 -> 是新引入的语法格式,代表指向动作,即goes to
- 大括号内的语法与传统方法体要求基本一致
1.3 lambda表达式的重要特征
- 1 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 2 可选的参数圆括号:一个参数无需定义圆括号,但无参数或多个参数需要定义圆括号。
- 3 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- -4 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
1.4 lambda表达式的常见格式
语法格式1:无参数无返回值
语法格式2:有一个参数,无返回值,或有返回值(return可以省)
语法格式3:有一个参数,无返回值,小括号可以省略
语法格式4:有两个以上参数,有返回值,并且Lammbda 体中有多条语句,多条语句用大括号
语法格式5:有两个以上参数,有返回值,并且Lammbda 体中只有一条语句,
return和大括号可以省略不写
语法格式6:Lammbda 表达式参数列表的数据类型可以省略不写,
JVM编译器会通过上下文推断出数据类型,即“类型推断”
1.5 语法格式1
无参数无返回值
//格式1:无参数,无返回值
@Test
public void m1(){
//传统写法
//匿名内部类创建Runnable接口的实现类对象,并重写run方法
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("hello,Lambda!");
}
};
r1.run();
//Lambda写法
Runnable r2 = ()-> System.out.println("hello,Lambda!");
r2.run();
}
1.6 语法格式2
有一个参数,无返回值,或有返回值(return可以省略)
//格式2:有一个参数无返回值
@Test
public void m2(){
//创建函数式接口Consumer的实现类对象con
Consumer<String> con = (x) ->System.out.println(x);
//调用实现类对象的方法,输出方法的方法的参数值x
con.accept("Hello Lambda!!");
}
1.7 语法格式3
有一个参数,无返回值,小括号可以省略
//格式3:有一个参数无返回值,小括号可以省略
@Test
public void m3(){
Consumer<String> con = x-> System.out.println(x);
con.accept("你好 Lambda表达式!!");
}
1.8 语法格式4
有两个以上参数,有返回值,并且Lammbda 体中有多条语句,多条语句用大括号
//格式4:有多个参数,有返回值,并且Lambda表达式中有多条语句,多条语句用大括号
@Test
public void m4() {
//创建函数式界口Comparator的实现类对象
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口!!");
//返回值:比较的结果值
System.out.println(x);
System.out.println(y);
return Integer.compare(x, y);
};
//赋值调用实现类对象调用方法
Integer resoult = com.compare(110, 22);
System.out.println(resoult);
}
1.9 语法格式5
有两个以上参数,有返回值,并且Lammbda 体中只有一条语句。return和大括号可以省略不写
//格式5:有两个以上参数,有返回值,并且Lammbda 体中只有一条语句,return和大括号可以省略不写
@Test
public void m5(){
Comparator<Integer> com = (x,y)->Integer.compare(x,y);
Integer result = com.compare(119, 33);
System.out.println(result);
}
1.10 语法格式6
Lammbda 表达式参数列表的数据类型可以省略不写,JVM编译器会通过上下文推断出数据类型,即“类型推断”
Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
Comparator<Integer> com 这里指定了数据类型
//格式6:Lammbda 表达式参数列表的数据类型可以省略不写
@Test
public void test6() {
Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);
Integer result = com.compare(100,200); //比大小
System.out.println(result);
}
3 函数式接口
3.1 函数式接口的概念
-
概念:
一个接口中的抽象方法只有一个,那么这个接口就是一个函数式接口 -
@FunctionalInterface
使用检测是否是函数式接口,在接口上直接加上注解,如果这个接口是一个函数式接口则不报错,否则编译报错 -
作用:
(1)是Lambda表达式的使用前提
(2)为了表示接口就代表这个抽象方法,所以将名起为函数式接口
3.2 函数式接口分类
在jdk8之后,官方定义了一些常用的函数式接口,如果以后需要使用类似的接口,直接 使用即可,不需要再单独定义。
接口类型 | 接口名 | 抽象方法 | 概述 |
---|---|---|---|
消费型接口 | Consumer | void accept(T t) 消费一个参数数据 | 该接口中的方法可以接收一个参数,接收的参数类型由泛型指定,对参数的操作 方式根据该接口的实现类决定,不需要返回值 |
供给型接口 | Supplier | T get():该方法不需要参数,它会按照某种逻辑,返回一个具体的数据 | 该接口也被称为生产型接口,如果指定了泛型是什么类型,那类中的get方法就会返回 一个该类型的一个具体数据。返回的数据,由该接口的实现类对象决定 |
函数型接口 | Function<T,R> | R apply(T):接收一个数据,操作数据之后,返回一个新的数据 | 该接口可以接收一个数据,数据的类型根据泛型指定,然后通过该接口的实现类对象对 该数据进行操作,操作之后返回一个新的数据。 |
断言型接口 | Predicate | boolean test(T t):对数据做出指定的判断 | 该接口是一个判断接口,接口可以接收一个指定泛型的参数,并根据该接口的实现类 对象对该参数做出对应的判断,返回只为boolean类型 |
- 1、消费型接口
- 2、供给型接口
- 3、函数型接口
- 4、断言型接口