可以称作闭包,是java8的重要特性
lambda允许把函数当做一个方法的参数,使代码简洁紧凑
前提:必须是函数式接口才能使用lambda表达式
函数式接口:任何接口,只包含一个抽象方法
//推导lambda表达式1 public class TestLambda{ public static void main(String[] args){ ILike like=new Like(); like.lambda(); } } //定义一盒函数式接口 interface ILike{ void lambda(); } //实现类 class Like implements ILike{ @override public void lambda(){System.out.println("我喜欢lambda")} }
静态内部类:顾名思义
//推导lambda表达式2 public class TestLambda{ //实现类挪到类里变成静态内部类 static class Like implements ILike{ @override public void lambda(){System.out.println("我喜欢lambda")} } public static void main(String[] args){ ILike like=new Like(); like.lambda(); } } //定义一盒函数式接口 interface ILike{ void lambda(); }
局部内部类:放在方法里的类
//推导lambda表达式3 public class TestLambda{ public static void main(String[] args){ ILike like=new Like(); like.lambda(); //实现类→静态内部类→局部内部类 class Like implements ILike{ @override public void lambda(){System.out.println("我喜欢lambda")} } } } //定义一盒函数式接口 interface ILike{ void lambda(); }
匿名内部类:没有类名,必须借助接口或父类
//推导lambda表达式4 public class TestLambda{ public static void main(String[] args){ //实现类→静态内部类→局部内部类→匿名内部类 like=new ILike(){ @override public void lambda(){System.out.println("我喜欢lambda")} } like.lambda(); } } //定义一盒函数式接口 interface ILike{ void lambda(); }
lambda:不要接口名,也不要方法名,只写方法体
//推导lambda表达式5 public class TestLambda{ public static void main(String[] args){ //实现类→静态内部类→局部内部类→匿名内部类→lambda like=()→{System.out.println("我喜欢lambda")}; like.lambda(); } } //定义一盒函数式接口 interface ILike{ void lambda(); }
带参数的lambda:a就是参数,参数类型可以去掉,一去掉就都去掉,多参数必须加括号
简化成3的前提:方法体只有一行