文章目录
1、Lambda简介
Lambda表达式是Java 8最流行最常用的功能特性。
它将函数式编程概念引入Java,函数式编程的好处在于可以帮助我们节省大量的代码,非常方便易用,能够大幅度的提高我们的编码效率。
2、须知
2.1、接口—>默认方法
关键字使用default进行修饰, 方法需要方法体。
这样的方法所有的子类会默认实现(不用自己写),如果想要覆盖重写,也可以在实现类中覆盖重写。
default关键字的作用,是用于扩展。
/**
* 从java8开始,接口当中允许定义default默认方法
* 修饰符:public default(public可以省略,default不能省略)
*/
public interface MyInterface {
void method1();
void method2();
// 接口中的一个默认方法
default void methodNew() {
System.out.println("接口默认方法执行");
}
}
2.2、接口—>静态方法
default(默认方法),所有的子类会默认实现。
但是,接口的静态方法不会被实现类所继承(实现)。
/**
* 从java8开始,接口当中允许定义静态方法
* 修饰符:static xxx
* 一般类的静态方法用法相同
*/
public interface Animal {
void eat();
// 接口中的一个静态方法
static Animal getAnimal() {
return new Cat();
}
}
2.3、函数式接口
函数式接口,在Java中是指:有且仅有一个抽象方法的接口。
函数式接口,即适用于函数式编程场景的接口。
而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。
函数式编程的好处在于可以帮助我们节省大量的代码,非常方便易用,能够大幅度的提高我们的编码效率。
只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。
2.3.1、函数式接口格式与@FunctionalInterface注解
格式:
即接口中,有且只有一个抽象方法的接口,即可。
例如Thread中的 run()方法。
Public interface 接口名称 {
返回值 方法名称();
}
@FunctionalInterface注解
有的注解是在编译期起作用,如@Override注解。
@FunctionalInterface 注解,同样是在编译期起作用。
该注解是 java8 专门为函数式接口引入的新的注解,作用于一个接口上。
一旦使用该注解来定义接口,编译期会强制检查该接口是否符合函数式接口的条件,不符合则会报错。
注:
即使不使用该注解,只要满足函数式接口的定义,这就是一个函数式接口。
3、lambda表达式
3.1、lambda表达式的格式
格式:
类似于ES6中的箭头函数。
(param1,param2,param3 ...,paramN)- > {
//代码块;
}
注:
- lambda表达式,表达的是函数式接口;
- 箭头左侧,是函数的以逗号分隔的形式参数列表;
- 箭头右侧是函数体代码;
3.2、lambda表达式的省略原则
1、参数类型可以省略。
但是,只能同时省略所有参数的类型,或者干脆都不省略。
2、如果形参列表中的参数,有且仅有一个,那么小括号可以省略。
3、如果大括号内的语句,有且仅有一条,那么,无论是否有返回值,return、大括号、分号都可以省略
3.3、原始写法
package com.zicheng.lambda;
/**
* 子诚
* Description:原始写法
* 时间:2020/3/30 9:38
*/
public class LambdaDemo {
//抽象功能接口
interface Printer {
void print(String val);
}
//通过参数传递功能接口
public void printSomething(String something, Printer printer) {
printer.print(something);
}
//通过创建对象调用函数
public static void main(String[] args) {
LambdaDemo demo = new LambdaDemo();
String something = "I am learning Lambda";
//实现Printer接口,内部类的方式
Printer printer = new Printer() {
@Override
public void print(String val) {
//控制台打印
System.out.println(val);
}
};
//调用接口打印
demo.printSomething(something, printer);
}
}
3.4、lambda表达式写法
package com.zicheng.lambda;
/**
* 子诚
* Description:
* 时间:2020/3/30 10:27
*/
public class LambdaDemo2 {
//抽象功能接口
interface Printer {
void print(String val);
}
//通过参数传递功能接口
public void printSomething(String something, Printer printer) {
printer.print(something);
}
//通过创建对象调用函数
public static void main(String[] args) {
LambdaDemo2 demo2 = new LambdaDemo2();
String something = "I am learning Lambda";
//实现Printer接口,内部类的方式
Printer printer = (String val) -> {
//控制台打印
System.out.println(val);
};
//调用接口打印
demo2.printSomething(something, printer);
}
}
3.5、对3.4中的lambda表达式,进行优化
3.4中的代码
//实现Printer接口,内部类的方式
Printer printer = (String val) -> {
//控制台打印
System.out.println(val);
};
3.5.1、省略参数类型,但又因为只有一个参数,把小括号也省略
//实现Printer接口,内部类的方式
Printer printer = val -> {
//控制台打印
System.out.println(val);
};
3.5.2、由于方法体中,只有一条语句,省略大括号
//实现Printer接口,内部类的方式
Printer printer = val -> System.out.println(val);