Java笔记(13) 简单的Lambda表达式
lambda表达式在jdk1.8引入,属于函数式编程,可以在特定的场景中省去很多没有意义的代码,只留下核心逻辑,使代码看起来更简洁。
函数式接口
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。对于函数式接口,可以通过lambda表达式来创建该接口的对象。
lambda表达式的推导
1. 正常实现
//1. 首先定义一个函数式接口
interface LambdaInterface{ void lambda(); }
//2. 实现类
class LambdaImpl implements LambdaInterface{
public void lambda(){
System.out.println("lambda test");
}
}
//3. 一般实现
public class TestLambda{
//main函数
public static void main(String[] args){
//创建一个新对象,
LambdaImpl lambda = new LambdaImpl();
lambda.lambda();
}
}
2. 静态内部类实现
将单独的实现类添加到Test类中,作为静态内部类,少定义了一个外部类
//1. 定义一个函数式接口
interface LambdaInterface { void lambda(); }
//2. 使用静态内部类实现
public class TestLambda {
//实现类作为静态内部类
static class LambdaImpl implements LambdaInterface {
public void lambda() {
System.out.println("lambda test!!");
}
}
public static void main(String[] args) {
new LmabdaImpl().lambda();
}
}
3. 通过局部内部类实现
将静态内部类进一步简化为局部内部类
//1. 定义一个函数式接口
interface LambdaInterface { void lambda(); }
//2. 使用局部内部类实现
public class TestLambda{
public static void main(String[] args) {
//2.实现类作为局部内部类
class LambdaImpl implements LambdaInterface{
public void lambda(){ System.out.println("lambda test!!");}
}
}
new LambdaImpl().lambda();
}
4. 通过匿名内部类实现
实现类是不需要类名的,只要实现方法即可,这里将其作为匿名内部类,进行类名的简化
//1. 定义一个函数式接口
interface LambdaInterface { void lambda(); }
//2. 使用匿名内部类实现
public class TestLambda{
public static void main(String[] args){
//直接在匿名内部类中实现LambdaInterface接口
LambdaTest lambda = new LambdaInterface(){
public void lambda(){
System.out.println("lambda test!!");}
}
lambda.lambda();//父类引用指向子类实例,多态
}
}
5. lambda简化
由于接口式函数中只有一个方法,即使通过匿名内部类实现,也必须指定方法名,这是没有意义的。因此在lambda表达式中,将默认的类名和方法名省略掉
//1. 定义一个函数式接口
interface LambdaInterface { void lambda(); }
//2. 使用lambda表达式实现
public class TestLambda{
public static void main(String[] args){
//将指定类名和方法名的过程全部省略,直接使用()->{}代替
LambdaTest lambda = ()->{ System.out.println("lambda test!!");}
lambda.lambda();//父类引用指向子类实例,多态
}
}
6. 带有参数的lambda表达式
lambda表达式是可以带有参数的:
//1. 定义一个带有参数的函数式接口
interface KeyBoard{void type(Character c);}
//2. 使用lambda表达式实现
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = (Character c) -> {
System.out.println(c + " was pressed");
};
}
}
6.1 简化参数类型
由于函数式接口只有一个方法,不存在重载的情况,因此参数列表式固定的,可以省略参数的类型:
//1. 定义一个带有参数的函数式接口
interface KeyBoard{void type(Character c);}
//2. 使用lambda表达式实现
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = (c) -> { //省略了参数的类型
System.out.println(c + " was pressed");
};
}
}
6.2 省略小括号
当lambda表达式只有一个参数的时候,连包裹参数列表的小括号也是可以省略的:
//1. 定义一个带有参数的函数式接口
interface KeyBoard{void type(Character c);}
//2. 使用lambda表达式实现
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = c -> {
System.out.println(c + " was pressed");
};
}
}
6.3 省略花括号
当lambda表达式实现的方法只有一条语句的时候,甚至还可以省略包裹方法体的花括号:
//1. 定义一个带有参数的函数式接口
interface KeyBoard{void type(Character c);}
//2. 使用lambda表达式实现
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = c -> System.out.println(c + " was pressed");
}
}
希望可以帮到你,还有未来的我
热门相关:无量真仙 霸皇纪 明月照大江 豪门闪婚:帝少的神秘冷妻 第一神算:纨绔大小姐