Lambda表达式超详细总结(简单易懂)

news2024/11/26 14:43:58

文章目录

        • 1、什么是Lambda表达式
        • 2、为什么使用Lambda表达式
        • 3、函数式接口(lambda表达式的使用前提)
        • 4、推导Lambda表达式
        • 5、Lambda表达式语法


1、什么是Lambda表达式

Lambda表达式,也可称为闭包。其本质属于函数式编程的概念,是Java8发布的最重要的新特性。

2、为什么使用Lambda表达式

  • 避免匿名内部类定义过多
  • 可以写出更简洁、更灵活的代码,只留下来核心的逻辑

3、函数式接口(lambda表达式的使用前提)

  • 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
public interface Runnable{
     public abstract void run();
}
  • 对于函数式接口,我们可以通过lambda表达式来创建该接口的对象

4、推导Lambda表达式

外部类、成员内部类、静态内部类、局部内部类、匿名内部类推导出Lambda表达式(使用前提必须是实现函数式接口)

/**
 * 代码推导Lambda表达式
 */
public class LambdaDemo {
    /**
     * 成员内部类
     */
    class Love2 implements ILove {
        @Override
        public void run() {
            System.out.println("我是成员内部类");
        }
    }

    /**
     * 静态内部类
     */
    static class Love3 implements ILove {
        @Override
        public void run() {
            System.out.println("我是静态内部类");
        }
    }

    public static void main(String[] args) {

        /**
         * 局部内部类(在main里)
         */
        class Love4 implements ILove {
            @Override
            public void run() {
                System.out.println("我是局部内部类");
            }
        }

        /**
         * 匿名内部类(没有类的名称,必须借助接口或者父类)
         */
        ILove love5 = new ILove() {
            @Override
            public void run() {
                System.out.println("我是匿名内部类");
            }
        };

        /**
         * 用Lambda简化
         */
        ILove love6 = () -> {
            System.out.println("我是Lambda简化版");
        };

        //1.外部内部类方式
        ILove love1 = new Love1();
        love1.run();

        //2.成员内部类方式
        LambdaDemo lambdaDemo = new LambdaDemo();
        ILove love2 = lambdaDemo.new Love2();
        love2.run();

        //3.静态内部类方式
        ILove love3 = new Love3();
        love3.run();

        //4.局部内部类
        ILove love4 = new Love4();
        love4.run();

        //5.匿名内部类
        love5.run();

        //6.用Lambda简化
        love6.run();
    }
}

//定义一个函数式接口
interface ILove {
    void run();
}

/**
 * 外部实现类
 */
class Love1 implements ILove {
    @Override
    public void run() {
        System.out.println("我是外部类");
    }
}

运行结果

image-20230105224353853

5、Lambda表达式语法

Lambda表达式在Java语言中引入了一个操作符==->==,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:

  • 左侧:指定了Lambda表达式需要的所有参数
  • 右侧:制定了Lambda体,即Lambda表达式要执行的功能。
(parameters) -> expression[表达式]
 (parameters) -> statement[语句]
  (parameters) -> {statement}

(1)语法格式一:无参,无返回值,Lambda体只需一条语句。如下:

public class LambdaDemo {
    public static void main(String[] args) {
        Ilove love = null;
        love = ()->{
            System.out.println("接口方法无参数,无返回值" );
        };
        love.run();
    }
}
interface ILove {
    void run();
}

(2)语法格式二:有一个参数(此时参数类型和小括号都可以省略,代码只有一行的时候,花括号也可以省略),无返回值,

love = a-> System.out.println(“接口只有一个参数,无返回值” + a);
love = (a)-> System.out.println(“接口只有一个参数,无返回值” + a);

public class LambdaDemo {
    public static void main(String[] args) {
        Ilove love = null;
        //1.简化参数类型
        love = a->{
            System.out.println("接口只有一个参数,无返回值" + a);
        };
        love.run(1314);
    }
}
interface Ilove{
    void run(int a);
}


public class LambdaDemo {
    public static void main(String[] args) {
        Ilove love = null;
        //2.简化花括号(代码只有一行时)
        love = a-> System.out.println("接口只有一个参数,无返回值" + a);
        love.run(1314);
    }
}
interface Ilove{
    void run(int a);
}

(3)语法格式三:有两个参数(参数类型可以省略,但小括号不可以省略),有返回值,并且Lambda体有多条执行语句。

public class LambdaDemo {
    public static void main(String[] args) {
        //1.简化参数类型
        Ilove love = (a, b) -> {
            System.out.println("接口只有两个个参数,有返回值");
            return a+b;
        };
        int run = love.run(1314, 521);
        System.out.println(run);
    }
}

interface Ilove {
    int run(int a, int b);
}

(4)语法格式四:Lambda体只有一条语句(return和花括号都可以省略。如果花括号省略,return一定要省略)。

public class LambdaDemo {
    public static void main(String[] args) {
        //1.简化参数类型
        Ilove love = (a, b) -> a+b;
        int run = love.run(1314, 521);
        System.out.println(run);
    }
}

interface Ilove {
    int run(int a, int b);
}

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

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

相关文章

js判断元素是否在可视区域内

基本概念 首先需要搞清楚 clientHeight、scrollTop 的区别,通俗地说,clientHeight 指的是网页可视区域的高度,scrollTop 指的是网页被卷起来的高度,可以参考这篇文章:彻底搞懂clientHeight、offsetHeight、scrollHeig…

SQL -- MySQL 初识

SQL SQL的概述: SQL全称: Structured Query Language,是结构化查询语言,用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统System上实现美国国家…

入门远程连接技术

目录 1、ssh实验 要求:a.两台机器:第一台机器作为客户端,第二台机器作为服务器,在第一台使用rhce用户免密登录第二台机器。b.禁止root用户远程登录和设置三个用户sshuser1, sshuser2, sshuser3, 只允许sshuser3登录&…

DOM(二):节点操作、事件高级

节点操作节点层级事件高级事件对象节点概述 节点至少拥有nodeType(节点类型)、nodeName(节点名称)、nodeValue(节点值)这三个基本属性。 元素节点 nodeType为1属性节点 nodeType为2文本节点 nodeType为3 &…

字节前端必会vue面试题集锦

Vue3有了解过吗?能说说跟vue2的区别吗? 1. 哪些变化 从上图中,我们可以概览Vue3的新特性,如下: 速度更快体积减少更易维护更接近原生更易使用 1.1 速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的…

3、数据库中的约束数据库设计

约束 * 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。 * 分类: 1. 主键约束:primary key 2. 非空约束:not null 3. 唯一约束:unique 4. 外键约束:forei…

3.0里程碑:Topomel Box 现已在微软商店可用

猿友好! 今天是个大喜的日子 我的程序 Topomel Box 的第三个版本(3.0)正式上架微软商店。通过微软商店这个统一的分发渠道,Topomel Box 有望与更多国家的用户见面并提供服务。 安装方法很简单,只需要打开微软商店(Microsoft Sto…

⚡️【数据结构】二叉树的概念和相关知识总结

🌲目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2满二叉树 2.3完全二叉树 2.4满二叉树和完全二叉树的区别 2.5二叉树的性质 2.6…

linux日志管理总结,rules详解、轮转详解、实例展示。

概述 ​ 1、日志文件记录系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等 ​ 2、通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。 1. rsyslog系统日志管理 1.1 处理日志的程序&#…

工控安全-Modbus重放攻击

文章目录Modbus-重放攻击Modbus-仿真环境(ModSim)Modbus-协议采集(ModbusScan)抓取Modbus/TCP流量使用青云工具进行重放攻击Modbus-重放攻击 Modbus-仿真环境(ModSim) 首先开启Modbus仿真环境 ip地址是10.10.100.11 ModSim32,这个软件是模拟Modbus协议的一个仿真…

git push错误->Error: src refspec master does not match any

参考文章问题描述:在执行命令 git push origin master 时报错->Error: src refspec master does not match any问题分析:在网上查找解决方法,大部分人说是暂存区没有文件,未执行git add 导致出错。但是此时已经执行了git add 操…

将石油和天然气推向边缘

无论是来自在线购物交易还是工业环境中的物联网(IoT)设备,数据都是不断收集的。幸运的是,世界各地的每一个行业都可以利用这一趋势,许多行业都已经这样做了。在石油和天然气行业,持续的数据通信是现在保持完…

JavaScript刷LeetCode-字符串类解题技巧

序章 我们把字符串、数组、正则、排序、递归归为简单算法。接下来系列里,将系列文章里将为大家逐一介绍。 字符串 翻转字符串中的单词 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1: 输…

数据库和SQL介绍

数据库管理系统(数据库软件)那么如何实现这种数据库形式的数据管理呢?我们需要借助:数据库管理系统,也就是常说的数据库软件。数据库软件是非常多的,常见的有:这些软件都能实现︰管理库﹑管理表、基于表来管理数据数据库和SQL的关系数据库是…

Java 诊断利器 Arthas 快速入门

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信…

ORB-SLAM2 --- LocalMapping::KeyFrameCulling函数

目录 1.函数作用 2.code 3.函数解析 1.函数作用 检测当前关键帧在共视图中的关键帧,根据地图点在共视图中的冗余程度剔除该共视关键帧。 冗余关键帧的判定:90%以上的地图点能被其他关键帧(至少3个)观测到。 2.code /*** brie…

第七次作业部分

文章目录1、获取根分区剩余大小2、获取当前机器ip地址3、统计出apache的access.log中访问量最多的5个IP4、打印/etc/passwd中UID大于500的用户名和uid5、/etc/passwd 中匹配包含root或net或ucp的任意行6、处理以下文件内容,将域名取出并根据域名进行计数排序处理(百度搜狐面试题…

透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。

1、粘包与半包 啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车 我上来就是一段代码猛如虎 1.1 服务器代码 public class StudyServer {static final Logger log LoggerFactory.getLogger(StudyS…

ORB-SLAM2 --- ORBmatcher::Fuse函数 --- 局部建图线程调用重载版

目录 1.函数作用 2.code 3.函数解析 1.函数作用 将参数一的关键帧的地图点与参数二的地图点集合进行融合。 将地图点投影到关键帧中进行匹配和融合;融合策略如下: 1.如果地图点能匹配关键帧的特征点,并且该点有对应的地图点&…

六、k8s Pod控制器详解

1 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建控制器创建的pod&#x…