Java中Lambda表达式基础及使用详解
概述
Lambda 是JDK 8 的重要新特性。它允许把函数作为一个方法的参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变的更加简洁紧凑,使Java代码更加优雅。
标准格式
-
三要素:形式参数 箭头 代码块 格式:(形式参数)->{代码块} 形式参数:如果多个参数用逗号隔开,无参留空 ->:英文中划线和大于号组成 代码块:具体要做的事
使用前提
-
有一个接口 接口中有且仅有一个抽象方法
举例:
1、无参无返回 定义一个接口
public interface Eatable { void eat(); }
接口实现类
public class EatableImpl implements Eatable{ @Override public void eat() { System.out.println("一天一苹果"); } }
测试类
public class EatableDemo { public static void main(String[] args) { //主方法调用useEatable Eatable e = new EatableImpl(); useEatable(e); //匿名内部类 useEatable(new Eatable() { @Override public void eat() { System.out.println("一天一苹果"); } }); //lambda表达式 useEatable(() -> { System.out.println("一天一苹果"); }); } private static void useEatable(Eatable e){ e.eat(); } }
2、有参无返回代码示例
public interface Eatable { void eat(String name); }
public class EatDemo { public static void main(String[] args) { useEat((String name) -> { System.out.println(name); System.out.println("输出的啥"); }); } private static void useEat(Eatable e){ e.eat("苹果"); } }
3、有参有返回
public interface Addable { int add(int x,int y); }
public class AddableDemo { public static void main(String[] args) { useAddable( (int x,int y ) -> { return x+y; }); } private static void useAddable(Addable a){ int sum = a.add(5, 7); System.out.println(sum); } }
省略模式
-
参数的类型可省略,多个参数时候不可只省略一个; 如果参数有且仅有一个可省略大括号和分号; 如果代码块的语句只有一条,可省略大括号和分号(有return时return也省略掉)
注意事项
-
必须要有接口,接口中有且仅有一个抽象方法 必须有上下文环境,才能推导出Lambda对应的接口:局部变量的赋值、调用方法的参数
Lambda表达式和匿名内部类的区别
所需类型不同:
-
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 Lambda表达式:只能是接口
使用限制不同:
-
如果接口中有且仅有一个抽象类,两者都可以使用 接口中多于一个抽象类,只能使用匿名内部类
实现原理不同:
-
匿名内部类:编译之后,产生一个单独的.class字节码文件 Lambda表达式:编译之后,没有单独的.class字节码文件,对应的字节码会在运行时动态的生成
上一篇:
IDEA上Java项目控制台中文乱码