当前位置: java基础教程 > 13-函数式接口、lambda表达式 > 阅读正文

lambda 表达式

2021.2.18.   446 次   1246字

lambda 表达式是 Java 8 的新特性,

此表达式作用上,仅用于函数式接口做参数或返回值时,快速生成实现类对象

在本质上, 匿名内部类会在 bin下生成class代码,而lambda 创建的则不会

1.语法格式
(参数列表) -> {一些语句}

对于 (参数列表),可以省略数据类型,如果只有一个参数时,还可省略 ()

对于 {一些语句},如果仅有一个语句,可省略 {}, return, ; (必须一起省略)

2.例子

1.创建 Demo.java 测试类文件,先创建一个函数式接口

2.创建另一个类,在构造方法中,使用函数式接口做参数

3.创建一个 main 函数 ,开始测试 lambda 表达式

public class Demo {
	public static void main(String[] args) {
		My my1 = new My(new MyInterface() {
			@Override
			public void show() {
				System.out.println("使用匿名内部类方式传递参数");
			}
		});
		My my2 = new My(()->System.out.println("使用lambda方式传递参数"));
	}
}
@FunctionalInterface
interface MyInterface {
	
	public abstract void show();
	
}
//创建一个调用函数式接口做参数的类
class My {
	
	//构造方法中的参数使用函数式接口
	public My(MyInterface my) {
		my.show();
	}
}
3.lambda表达式的延迟加载

表达式虽然会生成对象,但当且仅当对象使用时,才调用表达式生成该对象

也就是说,如果对象一直没被使用,就不会被创建,这样更节省性能

下面创建一个 Demo2.java文件,和代码中加上了一些提示输出语句,

public class Demo2 {
	public static void main(String[] args) {
		My2 my = new My2(2, new MyInterface2() {
			{
				System.out.println("匿名内部类被创建了");
			}
			@Override
			public void showLog() {
				System.out.println();
			}

		});
		My2 my2 = new My2(2,()->System.out.println("lambda表达式被执行啦"));
	}

}
@FunctionalInterface
interface MyInterface2 {
	
	public abstract void showLog();

}
//创建一个调用函数式接口做参数的类
class My2 {
	
	//构造方法中的参数使用函数式接口
	public My2(int level,MyInterface2 my) {
		if(level==1) {
			my.showLog();
		}
	}
}

运行上面的程序,发现匿名内部类被创建了,而 lambda 表达式没有被调用

( 严格来说,延迟加载就是被调用时创建,那么一旦调用则会创建)

( 以这种严格说法,实际上 lambda 表达式的延迟加载根本不能被代码证明)

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群