Lambda

it2025-02-18  3

Lambda 、方法引用和构造器引用

1.Lambda表达式

为什么使用 Lambda 表达式,他是什么?

可以理解为 一段可以传递的代码,使代码更灵活,简洁。

Lambda表达式就是一个函数式接口的实例。他是对象,不是函数,必须依附于函数式接口。

1.lambda表达式

/** * Lambda表达式的使用 * * 1.举例:(o1,o2) -> Integer.compare(o1,o2); * 2.格式: * -> :lambda操作符 或 箭头操作符 * -> 的左边: lambda形参列表 (其实就是接口中的抽象方法的形参列表) * -> 的右边: lambda体 (其实就是重写的抽象方法体,也就是重写的方法里面的语句) * 3. lambda表达式的使用:(分为6种情况介绍) * 总结: * -> 的左边:lambda形参列表的参数类型可以省略(类型推断);如果lambada形参列表只有一个参数,其()可以省略 * -> 的右边: lambda体应该使用{}包裹;如果lambada体只有一条执行语句(可能是return语句),ruturn和{}都可以省略 * * 4.lambda表达式的本质:做为函数式接口(@FunctionalInterface)的实例 * * 5.如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口 */ public class LambdaTest02 { //语法格式一:无参,无返回值 @Test public void test01(){ Runnable runnable = new Runnable() { @Override public void run() { System.out.println("wo爱北京天安门"); } }; runnable.run(); System.out.println("========================"); Runnable runnable2 = () -> System.out.println("wo爱北京圆明园"); runnable2.run(); } //语法格式二:lambda 需要一个参数,但是没有返回值: @Test public void test02() { Consumer<String> consumer = new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }; consumer.accept("谎言与誓言有什么区别?"); System.out.println("========================"); Consumer<String> consumer2 = (String s)-> System.out.println(s); consumer2.accept("谎言与誓言有什么相同之处?"); } //语法格式三:数据类型可以省略,因为可由编译器推断得出,称为”类型推断“ @Test public void test03() { Consumer<String> consumer = new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }; consumer.accept("谎言与誓言有什么区别?"); System.out.println("========================"); Consumer<String> consumer2 = (s)-> System.out.println(s); consumer2.accept("谎言与誓言有什么相同之处?"); } //语法格式四:lambda 若只需要一个参数时,参数的小括号可以省略 @Test public void test04() { Consumer<String> consumer1 = (s)-> System.out.println(s); consumer1.accept("谎言与誓言有什么相同之处?"); System.out.println("========================"); Consumer<String> consumer2 = s -> System.out.println(s); consumer2.accept("谎言与誓言有什么相同之处?"); } //语法格式五:lambda需要两个以上的参数,多条执行语句,并且可以有返回值 @Test public void test05() { Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { System.out.println(o1); System.out.println(o2); return o1.compareTo(o2); } }; System.out.println(comparator.compare(89,33)); System.out.println("====================="); Comparator<Integer> comparator2 = (o1, o2) -> { System.out.println(o1); System.out.println(o2); return o1.compareTo(o2); }; System.out.println(comparator2.compare(33,33)); } //语法格式六:当 lambda 体只有一条语句时,return 与大括号若有,都可以省略 @Test public void test06() { Comparator<Integer> comparator1 = (o1, o2) -> { return o1.compareTo(o2); }; System.out.println(comparator1.compare(33,33)); System.out.println("====================="); Comparator<Integer> comparator2 = (o1, o2) -> o1.compareTo(o2); System.out.println(comparator2.compare(32,33)); } }

2.函数式接口

jdk 1.8

/**4.lambda表达式的本质:做为函数式接口(@FunctionalInterface)的实例 5.如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口 */

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NdCBFHL-1603280733147)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20200614220119109.png)]

2.方法 引用

1.使用情境:当要传递给lambda体的操作,已经有实现的方法了,可以使用方法引用!

2.方法引用,本质是lambda表达式,而lambda表达式作为函数式接口的实例,所以方法引用,也就是函数式接口的实例。

3.使用格式:类(或者对象): : 方法名

4.具体分为如下的三种情况:

​ 情况一: 对象 : : 非静态方法

​ 情况二: 类 : : 静态方法

​ 情况三: 类 : : 非静态方法

5.方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同!

public class MethodRefTest { //情况一:对象 :: 实例方法 //Consumer中的void accept(T t) //System.out中的void println(T t) //写法:out :: println; @Test public void test01(){ Consumer<String> consumer1 = str -> System.out.println(str); consumer1.accept("北京"); System.out.println("====================="); PrintStream out = System.out; Consumer<String> consumer2 = out ::println; consumer2.accept("南京"); } //情况二:类 :: 静态方法 //Comparator中的int compare(T t1,T t2) //Integer中的int compare(T t1,T t2) //写法:Integer::compare; @Test public void test02(){ Comparator<Integer> comparator2 = (o1,o2) -> Integer.compare(o1,o2); System.out.println(comparator2.compare(93,93)); System.out.println("======================="); Comparator<Integer> comparator3 = Integer::compare; System.out.println(comparator3.compare(99,93)); } //情况三:类 :: 实例方法(有难度) //Comparator中的int compareTo(T t1,T t2) //String中的int t1.compare(T t2) //写法:String :: compareTo; @Test public void test03() { Comparator<String> comparator2 = (o1, o2) -> o1.compareTo(o2); System.out.println(comparator2.compare("adb", "ade")); System.out.println("=========================="); Comparator<String> comparator3 = String :: compareTo; System.out.println(comparator3.compare("ado", "ade")); } }

3.构造器引用

与方法引用类似:

​ 和方法以用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。

​ 抽象方法的返回值类型即为构造器所属的类型

写法:例子:

Employee : : new ;

4.数组引用

length -> new String[length];

omparator3.compare(“ado”, “ade”)); } }

## 3.构造器引用 与方法引用类似: ​ 和方法以用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。 ​ 抽象方法的返回值类型即为构造器所属的类型 写法:例子: Employee : : new ; ## 4.数组引用 length -> new String[length]; String[] :: new;
最新回复(0)