【Java】Lambda入门

java lambda入门到高级代码实例 代码的阅读和练习时最好的学习方式,在这里上传自己练习的,也希望能给朋友们有所帮助 立即下载

本文是Lambda的入门文章。主要向读者介绍Lambda的基本概念和写法。主要面向的读者是Java新手。

主要内容:

  • Lambda到底是什么东西?
  • 怎么通过Lambda简化代码?

背景知识:其中在逐步推导Lambda表达式时,需要用到并发编程中的Runnable接口。


目录

什么是Lambda

第一个Lambda表达式

原始写法

静态内部类简化

局部内部类简化

匿名内部类简化

Lambda简化

再简化

Lambda实例


什么是Lambda

基本特性:

  1. 是JDK1.8开始之后的新技术,是一种代码的新语法。
  2. 目的是为了简化匿名内部类的代码写法

使用前提:

  1. 首先必须是接口。
  2. 接口中只能有一个抽象方法。
  3. 即,Lambda表达式只能简化接口中只有一个抽象方法的匿名内部类形式。

函数式接口:

  1. 接口中只有一个抽象方法的接口称为函数式接口。
  2. 函数式接口注解:@FunctionalInterface 一旦某个接口加上了这个注解,这个接口只能、有且仅有一个抽象方法。

Lambda 语法

  1. (params) -> expression
  2. (params) -> statement
  3. (params) -> { statements }
  4. 左侧:Lambda 表达式的参数列表;右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体

第一个Lambda表达式

在并发编程中,我们可以通过实现Runnable接口来开辟一个新的任务线程。下面,通过任务线程的代码编写,来理解Lambda是如何简化写法的。

原始写法

首先明确,Runnable接口只有一个方法,满足函数式接口的条件:

以下是常规的写法:

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyThread()); //创建一个线程
        thread.start(); //执行线程
    }
}

//实现Runnable接口,实现任务线程
class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("线程"+Thread.currentThread().getName()+"执行了!");
    }
}

静态内部类简化

将线程任务类放在要调用内的内部,作为静态内部类或者成员内部类:

public class Main {
    //实现Runnable接口,实现任务线程
    public static class MyThread implements Runnable {
        @Override
        public void run() {
            System.out.println("线程"+Thread.currentThread().getName()+"执行了!");
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyThread()); //创建一个线程
        thread.start(); //执行线程
    }
}

局部内部类简化

把任务线程放在方法体内、局部变量的位置:

public class Main {
    public static void main(String[] args) {
        class MyThread implements Runnable { //局部内部类,就相当于申明一个变量
            @Override
            public void run() {
                System.out.println("线程"+Thread.currentThread().getName()+"执行了!");
            }
        }

        Thread thread = new Thread(new MyThread()); //创建一个线程
        thread.start(); //执行线程
    }
}

匿名内部类简化

省略实现类类名的方式,其中“new Runnable() {}”,等价于“class 名字 implements Runnable() {}”:

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程"+Thread.currentThread().getName()+"执行了!");
            }
        }); //申明任务线程

        thread.start(); //执行线程
    }
}

Lambda简化

Lambda的简化格式:

   (匿名内部类被重写方法的形参列表) -> {

       被重写方法的方法体代码。

   }

Lambda简化:

public class Main {
    public static void main(String[] args) {

        //使用Lambda简化:
        // 把"public void run()"简化为"()"。
        // 之所以不用指定方法名,是因为函数式接口中有且仅有一个方法,只要一调用,只有那一个方法可以调用
        // 方法体保持不变
        Thread thread = new Thread( () -> {
            System.out.println("线程"+Thread.currentThread().getName()+"执行了!");
        });
        thread.start();
    }
}

再简化

再简化:
public class Main {
    public static void main(String[] args) {
        //方法体内只有一行代码,可以直接去掉方法体的花括号:{}
        Thread thread = new Thread(() -> System.out.println("线程"+Thread.currentThread().getName()+"执行了!") );
        thread.start();
    }
}


匿名对象的简化:
public class Main {
    public static void main(String[] args) {
        //把Thread类转换为匿名对象
        new Thread(() -> System.out.println("线程"+Thread.currentThread().getName()+"执行了!")).start();
    }
}

Lambda实例

Lambda简化Comparator接口匿名内部类写法:

public static void main(String[] args) {
    List<Student> lists = new ArrayList<>();
    Student s1 = new Student("李铭",18,'男');
    Student s2 = new Student("冯龙",23,'男');
    Student s3 = new Student("王乐乐",21,'男');
    Collections.addAll(lists , s1 , s2 , s3);

    // 按照年龄进行升序排序!
    Collections.sort(lists, new Comparator<Student>() {
        @Override
        public int compare(Student s1, Student s2) {
            return s1.getAge() - s2.getAge();
        }
    });

    // Lambda简化写法
    Collections.sort(lists, (Student t1, Student t2) -> {
        return t1.getAge() - t2.getAge();
    });
    // 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。
    // 此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
    Collections.sort(lists,(Student t1, Student t2) -> t1.getAge() - t2.getAge());

    // 参数类型可以省略
    Collections.sort(lists, (t1,  t2) -> t1.getAge() - t2.getAge());

    System.out.println(lists);
}

forEach遍历简化

public static void main(String[] args) {
    List<String> names = new ArrayList<>();
    names.add("胡伟光");
    names.add("甘挺");
    names.add("洪磊");

    //forEach遍历原理
    names.forEach(new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    });

    //Lambda简化
    names.forEach((String s) -> {
        System.out.println(s);
    });

    //省略入参类型
    names.forEach((s) -> {
        System.out.println(s);
    });
    //如果只有一个参数,省略:入参括号
    names.forEach(s -> {
        System.out.println(s);
    });

    //Lambda表达式的方法体代码只有一行代码,省略花括号、分号
    names.forEach(s -> System.out.println(s) );

    names.forEach(System.out::println);
}

总结:

  • Lambda的作用是简化代码的写法,减少代码量。
  • 核心语法是:(参数1,参数2) -> { 方法体(如果方法体可以使用一句代码,则可以省略花括号) }

 

 

ubuntu 24.04安装ros1 noetic 上面是参考链接给的修改内容。除了上面要修改的地方,我在编译的生活还有一个地方报错,修改成如下形式。因为我已经对文件rosconsole_log4cxx.cpp作了上面的修改,所有是不是188行不太确认了,如果报“log4cxx::spi::LocationInfo”问题,按照下面修改就可以了。我在编译时还报了一个问题,就是我之前安装的是jazzy。所以在编译时会报ros变量名不对,这时对变量名做修改就可以了。具体怎么修改,百度。a、将源文件中所有CMakelist中编译标准改为c++ 17. 阅读详情

相关推荐

iPhone免越狱Git服务器搭建教程-iSH

iPhone免越狱Git服务器搭建教程

jts666的博客 4427

Java-lambda表达式入门(总结)

Java-lambda表达式入门(总结)

weixin_62079735的博客 376

滤波算法-呼吸心跳信号检测方法(四)

呼吸心跳信号检测系列文章:信号滤波处理

yjh_2019的博客 6269

Java Lambda 表达式 (小白看过来,大佬绕道!)

由于我们知道函数式接口只有一个方法,因此在将其作为参数传递时不需要定义该方法的名称。例如,我们有一个数据流(在我们的例子中是一个字符串列表),每个字符串是省市名和地区名的组合。在这篇文章,我们将学习 Lambda 表达式以及 Lambda 表达式与函数式接口的使用,泛型函数式接口,并演示流式传输 API。相反,它用于实现由函数式接口定义的方法。Lambda 表达式是在 Java 8 中首次引入的,它的主要目的是提高编程语言的表达能力,简化冗余代码。到现在为止,我们使用的是只接受一种类型的值的函数式接口。..

Candyz7的博客 660

紫光PG2L100H平台DDR3 IP核调试实战:从AXI接口到状态机设计的避坑指南

本文详细介绍了在紫光PG2L100H FPGA平台上调试DDR3 IP核的实战经验,重点解析了AXI接口的特殊行为和状态机设计的关键技巧。通过具体代码示例和调试方法,帮助开发者规避常见陷阱,实现高性能DDR3控制器设计,达到1.2GB/s的稳定带宽。

weixin_28717969的博客 218

为什么我把「大模型Clouder认证:基于百炼平台构建智能体应用」作为大模型学习的第一站?从 0 到拿证全流程经验分享

【摘要】作为一个刚拿下「大模型 Clouder 认证:基于百炼平台构建智能体应用」的过来人,想在开头就和大家聊聊这个认证的特殊意义 —— 在企业加速 AI 落地的今天,能用低代码快速构建智能体应用,已经成为 AI 从业者的核心竞争力。无论是企业微信客服提效、钉钉机器人自动化办公,还是网站智能助手升级,这些场景化能力正是当下数字化转型的刚需。

davidkorhenn的博客 1526

Java - Lambda 快速入门

package com.imooc; /** * 用户身份认证标记接口 */ @FunctionalInterface public interface IUserCredential { /** * 通过用户账号,验证用户身份信息的接口 * @param username 要验证的用户账号 * @return 返回身份信息[系统管理员、用户管理员、普通用户] */ String verifyUser(St......

742

告别手动群发!用IDA Pro和CE搞定企业微信4.1.38.6011的HOOK开发(附完整代码)

本文详细介绍了如何利用IDA Pro和Cheat Engine进行企业微信4.1.38.6011的HOOK开发,实现自动化群发功能。从逆向工程环境配置、关键函数定位到HOOK框架设计,提供完整代码示例,帮助企业提升运营效率。

weixin_42533120的博客 478

【Java基础】Java Lambda表达式详解

java8 中引入的 Lambda 表达式真的是个好东西,掌握之后,写代码更简洁了,一起来看看 Lambada 表达式常见的写法,加深理解。

yubao0723的专栏 1万+

手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

数字IC后端设计培训教程之手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

weixin_37584728的博客 2933

保研考研机试攻略:python笔记(4)

保研考研机试攻略:python笔记(4)二分法+最大公约数+最小公倍数+素数判断+幂次方mod方法+匹配问题+哈希算法+哈夫曼编码+二叉树

qq_63349644的博客 1096

JAVA8之Lambda表达式(初级)

JAVA学习,Lambda表达式

qq_42796149的博客 329

数控系统(CNC)系列:Fanuc 31i-B_(16).CNC系统的网络连接与数据传输

硬件连接:包括网络接口的类型、连接方式等。网络协议:常用的网络协议包括Ethernet、Modbus TCP、Profinet等。网络配置:如何在CNC系统中配置网络参数,使其能够正确接入网络。在网络化的现代工业生产环境中,CNC系统的网络连接和数据传输能力变得越来越重要。通过以太网、Modbus TCP和Profinet等网络协议,可以实现CNC系统与上位机、其他CNC系统以及各种工业设备之间的高效通信。

2401_87715305的博客 2434

Java 入门指南:Java 8 新特性 —— Lambda 表达式

Java Lambda 表达式是 Java 8 引入的一个功能,它允许以更简洁的方式编写函数式接口的实现。 Lambda 表达式可以被认为是一种匿名函数,它没有名称,但有参数列表、函数体和可能的异常列表。它可以用来替代使用匿名内部类实现函数式接口的方式 Lambda 表达式可以简化代码,使代码更加简洁、可读性更强,尤其在使用函数式接口和结合 Java Stream API 进行编程时非常有用。

热带鱼的技术博客 2146

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JAVA入门学习之Lambda表达式

顾名思义,函数式接口首先必须要是一个接口,同时该接口中只能包含一个方法。这一约束也可以防止简化代码时出现方法体对应不正确而造成错误。

qq_44705240的博客 203

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java Lambda 表达式入门

Java Lambda 表达式入门

Warms的博客 996

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java Lambda入门

Lambda表达式,也可称为闭包,它是推动Java 8发布的最重要新特性。Lambda允许把函数函数式接口作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda表达式可以使代码变的更加简洁紧凑,有效避免内部匿名类出现。Lambda 语法每个 Lambda 表达式都遵循以下法则:() 中的 parameter-list 是以逗号分隔的参数。你可以指定参数的类型,也可以不指定(编译器会根据上下文进行推断)。

qq_57570052的博客 545

Java Lambda表达式完全指南:从入门到精通

更简洁的集合处理代码更高效的并行计算能力更清晰的业务逻辑表达严格区分中间操作和终止操作理解流的一次性特性注意线程安全和变量捕获规则合理选择顺序流/并行流通过本文的代码示例和注意事项,相信您已经掌握了Lambda的核心用法。建议通过实际项目练习,逐步体会函数式编程的优雅与强大!

weixin_44343004的博客 1093

Java中的Lambda表达式:从入门到精通

Lambda表达式是Java 8引入的一项重要特性,它为Java编程带来了函数式编程的特性,使得代码更加简洁、灵活和易于理解。本文从基本语法到高级技巧全面介绍了Lambda表达式的应用,希望读者能够通过学习掌握Lambda表达式,提高代码编写的效率和质量。

微赚淘客系统开发者博客 366

Java lambda入门

Lambda 表达式(lambda expression)是一个匿名函数,即没有函数名的函数。 上代码,从最基本的接口往下引入lambda表达式 interface Arithmatic{ int sum(int a , int b ); } public class LambdaEx { public static void main(String[] args) { ...

weixin_45560548的博客 224

Java lambda 入门

Java 8 之前, 相对于java script/python 等语言中的匿名函数, 我们更常用的是使用匿名类。通俗易懂, 我们直接得到了加法和乘法的对象, 并不需要显式创建加法类和乘法类。Lambda 并不是一个字母缩写组合, 在IT开发中这个词代表的是匿名函数。没有了 new, 没有了返回的值类型。Client 类, 新建加法对象和乘法对象, 并执行。Java 8中 添加了Lambda 语法。接口Cal (计算类)上面的例子可以改写成。......

nvd11的专栏 379

java lambda表达式_Java中的Lambda表达式入门

了解如何在Java程序中使用lambda表达式和函数式编程技术在Java SE 8之前,通常使用匿名类将功能传递给方法。这种做法混淆了源代码,使其难以理解。Java 8通过引入lambda消除了这个问题。本教程首先介绍lambda语言功能,然后提供有关使用lambda表达式以及目标类型进行函数编程的更详细的介绍。您还将学习lambda如何与范围,局部变量,thisand super关键字以及Jav...

weixin_39618956的博客 144

java8特性: lambda表达式语法入门-笔记狂魔

lambda表达式简介 lambda表达式是java8推出的特性之一, 是一颗语法糖, 可以看成是一个匿名内部类的简化版(但是必须基于函数式接口, 后文中有说到), 用于写出更优雅的代码 注: 本篇博客适合于刚学习lambda表达式的小伙伴, 阅读本文需要一点匿名内部类相关知识 入门案例: 将匿名内部类改为lambda表达式进行对比 1. 准备一个接口Animal public interface Animal { // 动物吃东西 void eat(); } 2. 采用匿名内部类的方式

笔记狂魔-优快云博客 379

Java中的Lambda表达式入门

了解如何在Java程序中使用lambda表达式和函数式编程技术 在Java SE 8之前,通常使用匿名类将功能传递给方法。这种做法混淆了源代码,使其难以理解。Java 8通过引入lambda消除了这个问题。本教程首先介绍lambda语言功能,然后提供有关使用lambda表达式以及目标类型进行函数编程的更详细的介绍。您还将学习lambda如何与范围,局部变量,thisand super关键字以及Java异常交互。 请注意,本教程中的代码示例与JDK 12兼容。 自己发现类型 在本教程中,我不.

LeZiJie的博客 258

Java 8 Lambda表达式入门指南:让代码更简洁高效

摘要:Java 8引入的Lambda表达式是函数式编程的核心特性,通过简洁语法替代匿名内部类,提升代码可读性。其基础语法为(参数)->{方法体},需配合函数式接口使用。四大核心函数式接口包括Consumer、Supplier等,支持集合遍历、线程初始化等场景。方法引用作为Lambda的语法糖提供更简洁写法。最佳实践建议保持Lambda简短,避免修改外部变量。Lambda为Stream API奠定基础,可减少50%-80%代码量,是Java开发的重要分水岭。

weixin_62938484的博客 597

[Java]深入解析Lambda表达式从入门到精通的实战指南

Lambda表达式是Java 8引入的一个核心新特性,它标志着Java正式进入了函数式编程的大门。它的主要目的是为了简化匿名内部类的语法,尤其是对于那些只包含一个抽象方法的接口(即函数式接口)。通过Lambda,开发者可以用更简洁、更灵活的代码来实现行为参数化,从而编写出更易于维护和阅读的代码。从简化代码到赋能函数式编程,Lambda表达式已经成为现代Java开发不可或缺的一部分。通过与函数式接口、方法引用以及Stream API的结合使用,开发者可以构建出既简洁又强大的应用程序。

全球失控 495
上一篇: 【Java】注解入门
下一篇: 【Java】流(Stream)快速入门
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值