Java中Lambda表达式的使用

本文深入探讨了Java中的Lambda表达式,介绍了其概念、语法和使用场景,通过实例对比了Lambda表达式与匿名内部类的区别,展示了如何利用Lambda表达式简化代码,提高代码的可读性和效率。

一、什么是Lambda表达式

Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为两个部分:左侧:指定了 Lambda 表达式需要的所有参数右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能

二、Lambda表达式的作用

作用:简化匿名内部类的代码

例如:目的都是产生10条线程,分别用匿名内部类Lambda表达式来创建。
可以比较明显地看出使用Lambda表达式的代码较为简单

package com.czn.juc;

public class Test {
	public static void main(String[] args) {
		// 使用内部类创建线程对象
		for (int i = 0; i < 10; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					String name = Thread.currentThread().getName();
					System.out.println("使用匿名内部类创建的线程" + name + "正在执行。。。。。。。");
				}
			}).start();

		}

		// 使用Lambda表达式创建对象
		Runnable run = () -> {
			String name = Thread.currentThread().getName();
			System.out.println("使用Lambda表达式创建的线程" + name + "正在执行。。。。。。。");
		};
		for (int i = 0; i < 10; i++) {
			Thread thread = new Thread(run);
			thread.start();
		}
	}
}

运行结果:

在这里插入图片描述

三、函数式接口

下面我将逐步介绍Lambda表达式的用法,如有不对之处,请各位读者在评论区中指出,以期共同进步。
定义
如果接口内只定义一个抽象方法,则该接口称为函数式接口

例如:

@FunctionalInterface                     //函数式接口注解
interface IMammal {
	
	String NAME = "哺乳动物";
 
	void move();                    //唯一的抽象方法
 
	public default void eat() {         
		System.out.println("哺乳动物正在吃......");   //非抽象方法
	}
	public static void drink(){
		System.out.println("哺乳动物正在喝.......");  //非抽象的方法
	}
}

如果不确定所写的接口是否为函数式接口,可以使用注解@FunctionalInterface来检验
例如下图,我在接口中自定义了两个public(默认)的方法,在添加注解@FunctionalInterface之后会报错,因为接口中存在两个抽象方法。
在这里插入图片描述

来个关于函数式接口的简单小结:

  • 接口内只定义一个抽象方法
  • 函数式接口可以存在多个default修饰的方法
  • 函数式接口中也可以存在多个static修饰的静态方法
  • 可以用@FunctionalInterface注解来检验是否为函数式接口
  • 如果接口只有一个方法java默认它为函数式接口,此时可以省略@FunctionalInterface注解

四、Lambda表达式使用

lambda表达式,必须是函数式接口,必须只有一个方法

Java中Lambda表达式的写法为:
拷贝小括号(),写死右箭头->,落地大括号{...}
,即 ()->{}这种形式

  • 拷贝小括号(),即拷贝函数式接口中抽象方法中小括号的全部
  • 写死右箭头->,即在小括号左边写上->
  • 落地大括号{…},即在->后边加上{},然后在{}里面加上抽象方法的具体逻辑代码

例子1
下面的例子是函数式接口中的抽象方法是没有参数及返回值的

public static void main(String[] args) {
	// 函数式接口中的自定义的方法没有参数和返回值,则Lambda中也没有参数和返回值
	MyLambda1 ml = () -> {
		System.out.println("调用Lambda表达式ml的结果:我是lambda表达式");
	};
	ml.show();
}
//定义函数式接口
@FunctionalInterface
interface MyLambda1 {
	void show();
}

例子2
下面的例子是函数式接口中的抽象方法是有参数及返回值的

public static void main(String[] args) {
// 函数式接口中的自定义的方法有参数和返回值,则Lambda中也有参数和返回值
	MyLambda2 ml2 = (int x, int y) -> {
		return x + y;
	};
	int res = ml2.add(5, 6);
	System.out.println("调用Lambda表达式ml2的结果:" + res);
}
interface MyLambda2 {
	int add(int x, int y);
}

例子3:
下面的这个例子和例子2相似,只是加了default和static修饰的方法,这里主要是提醒读者加了多个default和static修饰的方法依然是函数式接口,因此可以使用Lambda表达式

public static void main(String[] args) {
	// 函数式接口中也可以有多个default和static修饰的方法
	//但是自定义的方法只能有一个!
	MyLambda3 ml3 = (int x, int y) -> {
		return x * y;
	};
	// 调用函数式接口中自定义的方法(有且仅有一个)
	int mul = ml3.mul(5, 5);
	System.out.println("调用Lambda表达式ml3的结果:" + mul);
	// 调用函数式接口中默认的实现方法
	ml3.show1();
	// 调用函数式接口中静态的方法
	MyLambda3.show2();
}
interface MyLambda3 {
	// 只能有一个自定义的public抽象方法
	int mul(int x, int y);

	// 可以有多个默认的实现方法
	default void show1() {
		System.out.println("函数式接口中可以有默认的方法");
	}

	// 也可以有多个默认的静态方法
	static void show2() {
		System.out.println("函数式接口中也可以有静态的方法");
	}
}

五、代码汇总

package com.czn.juc;

/**
 * lambda表达式的使用
 * 
 * @author 阿楠
 *
 */
public class LambdaExpression {

	public static void main(String[] args) {
		// 函数式接口中的自定义的方法没有参数和返回值,则Lambda中也没有参数和返回值
		MyLambda1 ml = () -> {
			System.out.println("调用Lambda表达式ml的结果:我是lambda表达式");
		};
		ml.show();

		// 函数式接口中的自定义的方法有参数和返回值,则Lambda中也有参数和返回值
		MyLambda2 ml2 = (int x, int y) -> {
			return x + y;
		};
		int res = ml2.add(5, 6);
		System.out.println("调用Lambda表达式ml2的结果:" + res);

		// 函数式接口中也可以有多个default和static修饰的方法,但是自定义的方法只能有一个!
		MyLambda3 ml3 = (int x, int y) -> {
			return x * y;
		};
		// 调用函数式接口中自定义的方法(有且仅有一个)
		int mul = ml3.mul(5, 5);
		System.out.println("调用Lambda表达式ml3的结果:" + mul);
		// 调用函数式接口中默认的实现方法
		ml3.show1();
		// 调用函数式接口中静态的方法
		MyLambda3.show2();
	}
}

@FunctionalInterface
interface MyLambda1 {
	void show();
}

interface MyLambda2 {
	int add(int x, int y);
}

interface MyLambda3 {
	// 只能有一个自定义的public方法
	int mul(int x, int y);

	// 可以有多个默认的实现方法
	default void show1() {
		System.out.println("函数式接口中可以有默认的方法");
	}

	// 也可以有多个默认的静态方法
	static void show2() {
		System.out.println("函数式接口中也可以有静态的方法");
	}
}

运行结果:
在这里插入图片描述

六、总结

  • Lambda表达式主要用于简化匿名内部类的代码,增强可读性
  • Lambda表达式的使用需要建立在函数式接口的基础上
  • 写法为:()->{},()存放参数,{}存放业务逻辑代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值