Java基础——Lambda表达式

news2025/7/31 14:16:45

一、函数式编程思想概述

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

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

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

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

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

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

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

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

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

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

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

  • 创建MyRunable类对象

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

  • 启动线程

public class MyRunnable implements Runnable{

    @Override
    public 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() {
            @Override
            public 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{
    @Override
    public 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字节码会在运行的时候动态生成

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B站游戏推广,怎样查看B站游戏推广榜数据?

近年来,B站发展得越来越大,越来越多的游戏商也加入B站进行推广,那么作为游戏运营商,怎样查看游戏在B站上的推广数据呢?游戏排行榜游戏商业推广榜包含视频推广榜、直播推广榜,按照日榜、周榜、月榜&#xff…

【Linux 网络编程1】使用UDP/TCP编写套接字,多进程/多线程版本的TCP编写的套接字,将套接字封装

目录 1.学习网络编程前的一些基础知识 2.UDP(user datagram protocol)协议的特点 3.使用有UPD编写套接字 4.使用TCP编写套接字 4.2.TCP客服端 4.3.TCP服务器端 4.4.单进程版本(没有人会使用) 4.5.多进程版本 4.6.多线程版本 5.把套接字封装 1…

扬帆优配|2600亿新能源巨头狂飙!外资唱多中国:再涨15%

全国停摆的危机,正在迫临法国。 大停工正在将法国推向风险境地。法国政府估计,当地时间3月7日,将迸发全国大型停工游行。法国总工会宣告,到时将让全法国停摆。法国担任交通业务的部长级代表克莱蒙博讷正告称,7日将成为…

JavaScript 混淆技术

根据JShaman(JShaman是专业的JavaScript代码混淆加密网站)提供的消息,JavaScript混淆技术大体有以下几种: 变量混淆 将带有JS代码的变量名、方法名、常量名随机变为无意义的类乱码字符串,降低代码可读性,如…

原神 Android 教程 —安卓版

准备材料 一台能读写 /system 分区的 Android 手机(或:一台安装了 Magisk 的 Android 手机) 有人搞出来免root端了,此条件不再必须私服客户端

数据同步工具Sqoop

大数据Hadoop之——数据同步工具SqoopSqoop基本原理及常用方法 1 概述 Apache Sqoop(SQL-to-Hadoop)项目旨在协助RDBMS(Relational Database Management System:关系型数据库管理系统)与Hadoop之间进行高效的大数据交…

HStream Console、HStreamDB 0.14 发布

近两个月,HStreamDB 相继发布了 0.13 和 0.14 版本,包含多项已知问题修复。同时,我们也发布了全新的 HStream Console 组件,为 HStreamDB 带来了简洁友好的图形化管理界面,将帮助用户更轻松地使用和管理 HStreamDB. H…

LinqConnect兼容性并支持Visual Studio 2022版本

LinqConnect兼容性并支持Visual Studio 2022版本 现在支持Microsoft Visual Studio 2022版本17.5预览版。 添加了Microsoft.NET 7兼容性。 共享代码-共享相同的代码,以便在不同的平台上处理数据。LinqConnect是一种数据库连接解决方案,适用于不同的基于.…

Ubuntu下安装Docker

大家好,我是中国码农摘星人。 欢迎分享/收藏/赞/在看! 文章目录1 安装Docker1.1 使用官方安装脚本自动安装 (仅适用于公网环境)1.2 手动安装帮助1.2.1 Ubuntu 14.04 16.04 (使用apt-get进行安装)2 安装校验3 镜像加速器3.1 安装&a…

在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)

本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据库。所以此次搭建使用的数据库是 PostgreSQL 11.4 版本。 一、部署 PostgreSQL 服务 1. 创建命名空间 将 PostgreSQL 和 SonarQube 放在同一个命名空间…

Docker(二)

5.容器数据卷 1.什么是容器数据卷 docker理念回顾 将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化 MySQL,容器删了&#xff0c…

都工作3年了,怎么能不懂双亲委派呢?(带你手把手断点源码)

💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…

c盘怎么清理到最干净?有什么好的清理方法

c盘怎么清理到最干净?有什么好的清理方法?清理C盘空间是电脑维护的重要步骤之一。C盘是Windows操作系统的核心部分,保存了许多重要的系统文件,因此空间不足会影响计算机的性能和稳定性。下面是一些清理C盘空间的方法 一.清理临时文件 在使用…

【Java学习笔记】10.条件语句 - if...else及switch case 语句

前言 本章介绍Java的条件语句 - if…else和switch case 语句。 Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法如下: if(布尔表达式) {//如果布…

实验二:动态规划

1.双11的红包雨 问题描述 双11到了,据说这2天会下红包雨,每个红包有不同的价值,小k好开心,但有个规则,就只能接掉落在他身旁的10米范围内的红包(0-10这11个位置)。小k想尽可能的多抢红包&…

评价提高分子对接性能的组合策略

评价提高分子对接性能的组合策略 相关背景: 分子对接可能是应用于基于结构的药物设计和虚拟筛选活动中最快速、成本最低的计算技术,它可以从巨大的化合物文库中找到潜在的活性分子,用于先导发现。 在分子对接中,配体(通常是小分…

LIME: Low-light Image Enhancement viaIllumination Map Estimation

Abstract当人们在低光条件下拍摄图像时,图像通常会受到低能见度的影响。除了降低图像的视觉美感外,这种不良的质量还可能显著降低许多主要为高质量输入而设计的计算机视觉和多媒体算法的性能。在本文中,我们提出了一种简单而有效的微光图像增…

2023年最新的站内SEO指南:如何通过关键词优化提高网站排名

SEO或搜索引擎优化是指通过改善网站的内部和外部元素,以获得更好的自然搜索引擎排名和更多的网站流量。 链接建设和外链是SEO的重要组成部分,因为它们可以提高网站的权威性和可信度,从而使其在搜索引擎中排名更高。 在此指南中,…

MySQL三范式

1、查询语句写的烂2、索引失效(数据变更)3、关联查询太多join(设计缺陷或不得已的需求)4、服务器调优及各个参数设置(缓冲、线程数等) 通常SQL调优过程: 观察,至少跑1天&#xff0…

CF756div3 vp

又被薄纱了,rk就不放了,好丢人QwQDashboard - Codeforces Round 756 (Div. 3) - CodeforcesA. Make Even小分类讨论题意:给定一个数,每次操作可以选取其前缀然后翻转其前缀,问你最少操作几次可以把该数变为偶数思路&am…