Java基础——Lambda表达式
创始人
2024-05-30 01:47:03
0

一、函数式编程思想概述

https://www.runoob.com/java/java8-lambda-expressions.html

在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿数据做操作”

面向对象强调“必须通过对象的形式来做事情”,做事情之前首先要创建一个对象

函数式思想则尽量忽略面向对象的复杂语法:”强调做什么,而不是以什么形式去做”,我们要学习的Lambda表达式就是函数时思想的体现

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

需求:启动一个线程,在控制台输出一句话:多线程启动了

1.1 方式一 创建类实现Runnable接口

  • 定义一个类MyRunnable实现Runnable接口,重写run()方法

  • 创建MyRunable类对象

  • 创建Thread类的对象,把MyRunnable的对象作为构造参数传递

  • 启动线程

public class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("多线程程序启动了");}
}
public class LambdaTest {public static void main(String[] args) {MyRunnable my = new MyRunnable();Thread t = new Thread(my);t.start();}
}

1.2 方式二 匿名内部类

        new Thread(new Runnable() {@Overridepublic void run() {System.out.println("ssss");}}).start();

1.3 方式三 lambda表达式

简洁,不用创建类

        new Thread( ()->{System.out.println("多线程程序启动");}).start();

Lambda表达式的代码分析

        new Thread( ()->{System.out.println("多线程程序启动");}).start();
  • ():里面没有内容,可以看成是方法形式参数为空

  • ->:用箭头指向后面要做的事情

  • {}:包含一段代码。我们称之为代码块

(形式参数)->{代码块}

  • 形式参数:如果有多个参数,参数之间用逗号隔开

  • ->:由英文中划线和大于符号组成,固定写法,代表指向动作

  • 代码块:我们具体要做的事情

二、Lambda表达式练习

2.1 抽象方法无参无返回值

public interface Eatable {void eat();
}

public class EatableImpl implements Eatable{@Overridepublic void eat() {System.out.println("好好好");}
}

public class EatableDemo {public static void main(String[] args) {Eatable e = new EatableImpl();userEatable(e);}private static void userEatable(Eatable e){e.eat();}
}

上面的代码可以简化

       userEatable(()->{System.out.println("好好好");} );

下面这个就不需要实现类的

public class EatableDemo {public static void main(String[] args) {userEatable(()->{System.out.println("好好好");} );}private static void userEatable(Eatable e){e.eat();}
}

2.2 抽象方法带参无返回值

定义接口

public interface Flyable {void fly(String s);
}

public class FlyableDemo {public static void main(String[] args) {userFlyable( (String s)->{System.out.println(s);System.out.println("好好好");});}private static void userFlyable(Flyable f){f.fly("风和日丽");}
}

2.3 抽象方法带参带返回值

public class AddableDemo {public static void main(String[] args) {userAddable( (int x,int y)->{return x+y;});}private static void userAddable(Addable a){int sum = a.add(10,20);System.out.println(sum);}
}

a.add(10,20)中的10和20最终传递给了int x,int y,然后通过lambda表达式将x与y相加并返回给sum

public interface Addable {int  add(int x,int y);
}

三、Lambda表达式的省略模式

3.1 参数的类型可以省略

虽然能省略,但是多个参数的情况下不能只省略一个

        userAddable( ( x, y)->{return x+y;});

3.2 参数有且只有一个,参数可以省略

public class FlyableDemo {public static void main(String[] args) {userFlyable(  s->{System.out.println(s);});}private static void userFlyable(Flyable f){f.fly("风和日丽");} 
}

3.3 代码块语句只有一条,可以省略大括号和分号

public class FlyableDemo {public static void main(String[] args) {userFlyable(  s->System.out.println(s) );}private static void userFlyable(Flyable f){f.fly("风和日丽");} 
}

3.4 代码块语句只有一条,return也要省略掉

        userAddable( ( x, y)-> x+y);

四、注意事项

  • 有一个接口(抽象类不可以),接口中有且只有一个抽象方法

  • 使用lambda的时候必须有上下文环境,才能推导出Lambda对应的接口

匿名内部类编译之后会多出一个“.class”文件,而lambda不会多出,lambda字节码会在运行的时候动态生成

匿名内部类可以是接口,可以是抽象类,还可以是具体类

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...