Java学习十四—Java8特性之Lambda表达式

news2024/11/27 22:32:50

一、简介

Java 8 引入了 Lambda 表达式,它是一种更简洁、更便于使用的函数式编程特性。Lambda 表达式允许将函数作为方法的参数(函数式接口的实例)传递给某个方法,或者将代码像数据一样进行传递。

555555

lambda是一个匿名函数,我们可以吧lambda表达式理解为是一段可以传递的代码。使用它可以写出更简洁,更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

lambda接口的实质:作为函数式接口的实例,关键是这个匿名内部类的简化,省略。

二、语法

2.1基本语法

Lambda 表达式的基本语法如下:

(parameters) -> expression
或者
(parameters) -> { statements; }

其中:

  • 参数列表:可以为空,也可以包含一个或多个参数。例如 (int a, int b)​ 或者 (String s)​。

  • 箭头 -> ​:箭头将参数列表与 Lambda 表达式的主体分隔开来。

  • 主体

    • 如果主体只有一条语句,可以直接写表达式,不需要大括号 {}​。
    • 如果主体有多条语句,需要使用大括号 {}​ 将语句块括起来。

2.2Lambda表达式中推荐变量名

在Lambda表达式中,变量名的选择同样应该考虑可读性和代码的清晰度。以下是一些在Lambda表达式中常用的推荐变量名:

  1. e: 通常用于表示集合中的元素。
  2. x​, y​, z: 用作通用的变量名,可以表示任意类型的对象。
  3. p​, q: 可以用于表示方法的参数。
  4. i​, j​, k: 用于表示循环计数器。
  5. result​, output: 用于表示Lambda表达式的返回值。
  6. predicate: 表示一个谓词(Predicate)参数,用于筛选操作。
  7. consumer: 表示一个消费者(Consumer)参数,用于对元素进行处理。
  8. function: 表示一个函数(Function)参数,用于转换或映射操作。
  9. supplier: 表示一个供应者(Supplier)参数,用于生成结果或对象。

这些变量名是一种约定俗成的习惯,使用它们可以提高代码的可读性和可维护性。当然,具体的变量名选择仍然取决于上下文和个人偏好,关键是确保变量名能够准确地描述其含义和作用

在Lambda表达式中,你可以使用任何合法的标识符作为变量名,包括使用o​来表示集合中的元素。然而,建议在可读性和代码清晰度方面选择更有描述性的变量名。

选择一个有意义的变量名可以使代码更易于理解和维护。在表示集合中的元素时,通常建议选择具有描述性的名称,以便更清晰地表示元素的含义。

例如,如果集合中的元素是商品对象,则可以将变量名命名为product​;如果集合中的元素是订单对象,则可以将变量名命名为order​。这样可以提高代码的可读性,使其他人更容易理解你的代码意图。

List<Product> products = ...
products.forEach(product -> {
    // 对每个商品进行操作
});

2.3示例 1:简单的输出

// 无参数的Lambda表达式
() -> System.out.println("Hello, Lambda!");

2.4示例 2:带参数的Lambda表达式

// 带一个参数的Lambda表达式
(String s) -> System.out.println(s)

// 带两个参数的Lambda表达式
(int a, int b) -> a + b

2.5示例 3:带返回值的Lambda表达式

// Lambda表达式的主体是一个表达式,直接返回结果
(int a, int b) -> a * b

// Lambda表达式的主体是一个代码块,可以包含多条语句
(int a, int b) -> {
    if (a > b)
        return a;
    else
        return b;
}

三、示例

3.1Runnable接口案例

传统方式

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Lamada01ApplicationTests {

    @Test
    void contextLoads() {
    }

    @Test
    public void test01(){
        Runnable r1=new Runnable() {
            @Override
            public void run() {
                System.out.println("好好学习,天天向上");
            }
        };

        r1.run();
    }
}

image-20230629094511338

lamada方式

    @Test
    public void test02(){
        Runnable r2=()-> System.out.println("北京天安门");
        r2.run();
    }

image-20230629094924905

分析

image-20230629095027018

image-20230629105139739

3.2比较大小案例

传统方式

    @Test
    public void test03(){
        Comparator<Integer> comparator=new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };

        int compare = comparator.compare(12, 21);
        System.out.println(compare);
    }

image-20230629101751118

lamada方式

    @Test
    public void test04(){
        Comparator<Integer> comparator=(o1,o2)->Integer.compare(o1,o2);

        int compare = comparator.compare(32, 35);
        System.out.println(compare);

    }

image-20230629101822791

分析

image-20230629102019605

3.3Consumer案例

传统方式

    @Test
    public void test05(){
        Consumer<String> consumer=new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };

        consumer.accept("25533/");

    }

image-20230629104303469

lamada方式

    public void test06(){
        Consumer<String> consumer=s -> System.out.println(s);

        consumer.accept("/85572");
    }

image-20230629104208082

分析

image-20230629104543828

image-20230629103612764

image-20230629103652321

3.4排序案例

我们先来看一段老版本的示例代码,其对一个含有字符串的集合进行排序:Collections 工具类提供了静态方法 sort 方法,入参是一个 List 集合,和一个 Comparator 比较器,以便对给定的 List 集合进行 排序。上面的示例代码创建了一个匿名内部类作为入参,这种类似的操作在我们日常的工作中随处可见。

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class HelloWorld{

     public static void main(String []args){
    
        List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
    
        Collections.sort(names, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return a.compareTo(b);
            }
        });
    
        System.out.println(names);
    
     }
}

image-20230628182340312

Lambda 表达式

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class HelloWorld{

     public static void main(String []args){
    
        List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
    
    
        Collections.sort(names, (String a, String b) -> {
            return a.compareTo(b);
        });
    
    
        System.out.println(names);
    
     }
}

image-20230628182557151

分析

    @Test
    public void Test07(){
        List<String> names= Arrays.asList("peter", "anna", "mike", "xenia");
        Collections.sort(names, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });

        System.out.println(names);
    }

image-20230629110800036

    @Test
    public void Test08(){
        List<String> names= Arrays.asList("peter", "anna", "mike", "xenia");
        Collections.sort(names, (String o1,String o2)->{
            return o1.compareTo(o2);
        } );

        System.out.println(names);
    }

image-20230629182101282

image-20230629182215152

3.5使用 Lambda 表达式与 Streams API

Java 8 的 Streams API 允许你以声明性方式处理集合。以下是使用 Lambda 表达式过滤和处理集合的示例:

List<String> filteredNames = names.stream()  // 创建 Stream
    .filter(name -> name.length() > 4)        // 使用 Lambda 表达式过滤
    .collect(Collectors.toList());             // 收集结果
System.out.println(filteredNames); // 输出 [Peter, Kim]

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

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

相关文章

Kubernetes分享

幂等性(Idempotency) 介绍 简单来说&#xff0c;幂等性幂等性(Idempotency)是计算机科学中的一个重要概念&#xff0c;特别是在分布式系统和网络应用中。指的是某个操作可以重复执行多次&#xff0c;但其结果是相同的&#xff0c;不会因为多次执行而改变系统的状态。 https://…

解决后端限制导致前端配置跨域仍请求失败报504的问题

文章目录 问题一、通过配置跨域方式二、直接真实接口请求三、解决方式四、后端这样做的原因 总结 问题 前端项目设置跨域proxy处理&#xff0c;接口请求不会报跨域&#xff0c;但是接口请求报了504&#xff0c;这种情况如何处理呢&#xff0c;后端又为何要这么做&#xff0c;下…

2007-2022年中国各企业数字化转型与供应链效率

企业数字化转型与供应链效率是现代企业管理和发展的两个关键方面。以下是对中国各企业数字化转型与供应链效率数据的介绍&#xff1a; 数据简介 企业数字化转型&#xff1a;指企业通过采用数字技术与创新方法&#xff0c;改造业务流程、组织结构和产品服务&#xff0c;以提升…

U盘非安全拔出后的格式化危机与数据拯救策略

在数字化时代&#xff0c;U盘作为便捷的数据携带工具&#xff0c;其重要性不言而喻。然而&#xff0c;许多用户在日常使用中往往忽视了安全退出的重要性&#xff0c;直接拔出U盘后再插入时可能会遭遇“需要格式化”的提示&#xff0c;这一状况不仅令人措手不及&#xff0c;更可…

STM32+ESP8266(ESP32)+MQTT+阿里云物联网平台

1、阿里云物联网平台 - 阿里云物联网平台配置 产品-设备-编辑物模型-设备端开发-查看上报数据 在产品上添加物模型&#xff0c;然后设备是继承自产品的&#xff0c;因此也具有物模型 添加产品、添加设备、产品上添加物模型 - 使用IOT Studio 绘制界面显示温度、湿度、灯开…

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代&#xff0c;pdf文件转换成图片格式是一种常见的操作&#xff0c;无论是在工作还是日常生活中&#xff0c;我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么&#xff0c;如何高效地将pdf转换成图片呢&#xff1f;本文…

CSRF靶场通关合集

目录 前言 CSRF漏洞总结 1.PiKachu靶场 1.1CSRF(get) 1.2 CSRF(post)请求 1.3 CSRF Token 2.DVWA靶场 难度低 难度中 难度高 前言 最近系统的将从web渗透到内网渗透的知识点做一个回顾,同时结合一些实战的案例来演示,下面是对刚开始学习时对靶场的一个总结. CSRF漏洞…

快速搭建发卡独立站(完全免费)

本文介绍如何使用开源项目&#xff0c;零成本&#xff0c;无需服务器的方式搭建一套自己的数字商品/发卡独立站&#xff0c;不需要任何开发能力&#xff0c;即便是小白用户也能搭建。 感兴趣可直接查看开源项目地址&#x1f449; https://github.com/iDataRiver/theme-basic …

sqlite 数据库 介绍

文章目录 前言一、什么是 SQLite &#xff1f;二、语法三、SQLite 场景四、磁盘文件 前言 下载 目前已经出到了&#xff0c; Version 3.46.0 SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是…

Node 中基于 Koa 框架的 Web 服务搭建实战

前言 在《Node之Web服务 - 掘金 (juejin.cn)》一文中,我们使用 HTTP 模块构建了后端接口,从而实现了后端服务的开发。可以对此进行进一步优化 http模块代码回顾 const http require("http");const server http.createServer((req, res) > {if (reqUrl.pathna…

Simulated Annealing

模拟退火最大值算法&#xff1a; 初始化起始解 x 0 x_0 x0​ 、温度 t 0 t_0 t0​ 以及迭代次数 steps&#xff0c;计算初始值 y 0 y_0 y0​扰动产生新解 x 1 x_1 x1​, 计算对应函数值 y 1 y_1 y1​依据 Δ y y 1 − y 0 \Delta y y_1 - y_0 Δyy1​−y0​ 决策是否接…

element-ui输入框如何实现回显的多选样式?

废话不多说直接上效果&#x1f9d0; 效果图 <template><div><el-form:model"params"ref"queryForm"size"small":inline"true"label-width"68px"><el-form-item label"标签" prop"tag&q…

CurrentHashMap巧妙利用位运算获取数组指定下标元素

先来了解一下数组对象在堆中的存储形式【数组长度&#xff0c;数组元素类型信息等】 【存放元素对象的空间】 Ma 基础信息实例数据内存填充Mark Word,ClassPointer,数组长度第一个元素第二个元素固定的填充内容 所以我们想要获取某个下标的元素首先要获取这个元素的起始位置…

UEC++ 虚幻5第三人称射击游戏(二)

UEC++ 虚幻5第三人称射击游戏(二) 派生榴弹类武器 新建一个继承自Weapon的子类作为派生榴弹类武器 将Weapon类中的Fire函数添加virtual关键字变为虚函数让榴弹类继承重写 在ProjectileWeapon中重写Fire函数,新建生成投射物的模版变量 Fire函数重写逻辑 代码//生成的投射物U…

使用Spring Boot和自定义缓存注解优化应用性能

在现代应用开发中&#xff0c;缓存是提高系统性能和响应速度的关键技术之一。Spring Boot提供了强大的缓存支持&#xff0c;但有时我们需要更灵活的缓存控制。本文将介绍如何使用Spring Boot和自定义缓存注解来优化应用性能。 1. 为什么需要自定义缓存注解&#xff1f; Sprin…

CH12_函数和事件

第12章&#xff1a;Javascript的函数和事件 本章目标 函数的概念掌握常用的系统函数掌握类型转换掌握Javascript的常用事件 课程回顾 Javascript中的循环有那些&#xff1f;Javascript中的各个循环特点是什么&#xff1f;Javascript中的各个循环语法分别是什么&#xff1f;…

Android仿今日头条新闻(一)

新建一个侧边栏的文件&#xff0c;创建成功后直接运行。可以看到带滑动的侧边栏功能如图所示&#xff1a; 主体UI&#xff1a; 新闻UI的实现: 侧边栏&#xff1a; 更换一下颜色&#xff1a; 学习参考-浩宇开发

科研绘图系列:R语言两组数据散点分布图(scatter plot)

介绍 展示两组数据的散点分布图是一种图形化表示方法,用于显示两个变量之间的关系。在散点图中,每个点代表一个数据点,其x坐标对应于第一组数据的值,y坐标对应于第二组数据的值。以下是散点图可以展示的一些结果: 线性关系:如果两组数据之间存在线性关系,散点图将显示出…

【JVM系列】Full GC(完全垃圾回收)的原因及分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

IDA*——AcWing 180. 排书

IDA* 定义 IDA*&#xff08;Iterative Deepening A*&#xff09;是一种结合了深度优先搜索&#xff08;DFS&#xff09;的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题&#xff0c;尤其是当搜索空间很大或者搜索成本不确定时。 IDA* 是…