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

一、简介

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;elsereturn b;
}

三、示例

3.1Runnable接口案例

传统方式

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Lamada01ApplicationTests {@Testvoid contextLoads() {}@Testpublic void test01(){Runnable r1=new Runnable() {@Overridepublic void run() {System.out.println("好好学习,天天向上");}};r1.run();}
}

image-20230629094511338

lamada方式

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

image-20230629094924905

分析

image-20230629095027018

image-20230629105139739

3.2比较大小案例

传统方式

    @Testpublic void test03(){Comparator<Integer> comparator=new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1,o2);}};int compare = comparator.compare(12, 21);System.out.println(compare);}

image-20230629101751118

lamada方式

    @Testpublic 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案例

传统方式

    @Testpublic void test05(){Consumer<String> consumer=new Consumer<String>() {@Overridepublic 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>() {@Overridepublic 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

分析

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

image-20230629110800036

    @Testpublic 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.mzph.cn/pingmian/42964.shtml

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

相关文章

Ubuntu 修改 shell 命令行提示为只显示当前工作目录的基本名称而非完整路径

在 Ubuntu 上遇到一个比较烦人的点&#xff0c;它会默认在命令行提示符显示当前工作目录的绝对路径&#xff0c;当目录比较深的时候就显得命令行提示符字符串很长&#xff0c;在需要分屏多终端同时使用的场景下就显得很恶心&#xff0c;下面是个人找到的将 shell 命令行提示为只…

LLM之RAG实战(四十一)| 使用LLamaIndex和Gemini构建高级搜索引擎

Retriever 是 RAG&#xff08;Retrieval Augmented Generation&#xff09;管道中最重要的部分。在本文中&#xff0c;我们将使用 LlamaIndex 实现一个结合关键字和向量搜索检索器的自定义检索器&#xff0c;并且使用 Gemini大模型来进行多个文档聊天。 通过本文&#xff0c;我…

IPython交互式数据分析:释放Python数据科学的无限潜能

IPython交互式数据分析&#xff1a;释放Python数据科学的无限潜能 IPython&#xff0c;现在通常指的是其Jupyter Notebook环境&#xff0c;已成为数据科学家和分析师进行数据分析和探索的强大工具。IPython的交互式数据分析工具提供了丰富的功能&#xff0c;包括交互式计算、可…

系统性能监控和调优

系统性能监控和调优 系统性能监控是对计算机系统的运行状态、资源利用率以及潜在瓶颈进行持续观察的过程&#xff0c;目的是保证系统的稳定性和高效性。它涉及CPU、内存、磁盘I/O、网络流量等关键指标的实时跟踪和分析&#xff0c;以及定期进行性能基准测试。调优则是在发现问…

明确产业定位,用科学规划铸就高品质文化产业园

科学规划是构建高品质文化产业园区的重要保障。通过明确产业定位与发展目标、科学规划空间布局、完善基础设施与配套设施、注重生态环境保护、加强人才引进与培养以及推动产业协同发展等措施的实施&#xff0c;可以推动文化产业园区向高品质、高效益、可持续的方向发展。 一、明…

【TB作品】51单片机 Proteus仿真 超声波读取+LCD1602显示仿真12MHZ

实验报告&#xff1a;51单片机 Proteus仿真 超声波读取LCD1602显示仿真 一、实验背景 本实验旨在使用51单片机&#xff08;AT89C51&#xff09;结合超声波传感器HC-SR04和LCD1602液晶显示屏&#xff0c;通过Proteus仿真平台实现超声波测距功能&#xff0c;并将测得的距离显示…

leetcode hot100

哈希 49.字母异位词分组 HashMap的含义比较晕&#xff0c;可以重做 双指针 11.盛最多水的容器 双指针的起始位置和移动条件没转过来&#xff0c;可以重做 15.三数之和 不太熟练&#xff0c;可以再做一遍 42.接雨水 还可以用dp和单调栈做 双指针法&#xff1a; 首先需要注意…

【DFS(深度优先搜索)详解】看这一篇就够啦

【DFS详解】看这一篇就够啦 &#x1f343;1. 算法思想&#x1f343;2. 三种枚举方式&#x1f343;2.1 指数型枚举&#x1f343;2.2 排列型枚举&#x1f343;2.3 组合型枚举 &#x1f343;3. 剪枝优化&#x1f343;4. 图的搜索&#x1f343;5. 来几道题试试手&#x1f343;5.1 选…

MySQL参数lower_case_table_name

系统参数lower_case_table_name是 MySQL 中的一个系统变量&#xff0c;它控制着 MySQL 服务器如何存储和比较表名的大小写。这个参数对于在不同操作系统上运行的 MySQL 实例来说非常重要&#xff0c;因为不同操作系统对文件名的大小写敏感性不同。 lower_case_table_names 可以…

助力开发者,而非取代

AI&#xff1a;助力开发者&#xff0c;而非取代 在软件开发的广阔天地中&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正以其独特的方式重塑着行业的面貌。AI工具如GitHub Copilot、TabNine等&#xff0c;以其强大的能力成为开发者的得力助手。但随着AI的不断进步&…

spark任务,使用 repartition 对数据进行了重新分区,但任务输入数据大小仍存在不均衡

目录 目录 确认 Spark 任务重新分区后的数据不均衡 1. 检查分区大小 2. 使用 DataFrame API 检查分区 3. 使用 Spark UI 查看分区情况 4. 使用日志记录分区信息 可能原因 1. 数据分布不均衡 2. 分区策略 3. 数据预处理 解决方案 1. 检查数据分布 2. 使用 coalesce…

【C语言小知识】ctype.h系列的字符函数

ctype.h系列的字符函数 链接: ctype.h 在代码中&#xff0c;本意是将字符转换&#xff0c;但过程中标点也会被转换&#xff0c;这是因为对应的ASCII码会被相对应的转换&#xff0c;如果程序值转换字母&#xff0c;保留所有的非字母字符&#xff08;不是空格会更好&#xff09;。…

代码随想录算法训练营Day62|冗余连接、冗余连接II

冗余连接 108. 冗余连接 (kamacoder.com) 考虑使用并查集&#xff0c;逐次将s、t加入并查集中&#xff0c;当发现并查集中find(u)和find(v)相同时&#xff0c;输出u和v&#xff0c;表示删除的边即可。 #include <iostream> #include <vector> using namespace s…

【分布式系统】注册中心Zookeeper

目录 一.Zookkeeper 概述 1.Zookkeeper 定义 2.Zookkeeper 工作机制 3.Zookkeeper 特点 4.Zookkeeper 数据结构 5.Zookkeeper 应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 6.Zookkeeper 选举机制 第一次启动选举机制 非第一次…

P2895题解

BFS板子题&#xff0c;但有坑点需要注意&#xff0c;以此纪念一下本人发生事故之后的第一道题。 #include<bits/stdc.h> using namespace std; const int MAX30010; struct node{int x,y,t;bool v; }m[MAX][MAX];//路径地图 int star[MAX][MAX];//下坠时间地图 int fx[]…

单元测试和集成测试

软件测试中&#xff0c;单元测试和集成测试是比较常见的方法 单元测试&#xff1a;这是一种专注于最小可测试单元&#xff08;通常是函数或方法&#xff09;的测试&#xff0c;用于验证单个组件的行为是否符合预期。它通常由开发者自己完成&#xff0c;可以尽早发现问题&#…

解锁京东 APP 商品详情的 API 接口获取方法

在当今数字化的商业世界中&#xff0c;获取准确和及时的商品信息对于许多业务场景至关重要。其中&#xff0c;通过 API 接口来获取京东 APP 商品详情成为了一种备受关注的技术手段。 一、为什么要获取京东 APP 商品详情 电商数据分析 对于电商从业者和数据分析人员来说&#x…

uboot镜像之boot烧写

适用场景:单板上没有boot&#xff0c;和按地址烧写配合&#xff0c;可完成单板所有镜像的烧写。 原理:bootrom读取u-boot.bin至内存并执行此u-boot 然后运行uboot,通过uboot sf命令烧录uboot.bin到flash存储空间去. bootrom读取u-boot.bin至内存并执行此u-boot 通过uboot sf命…

php文件引入。 ctrl+鼠标左键可以成功追踪,代码执行报错

举例&#xff1a; admin文件夹 同级文件singer.php admin文件夹下的文件AdminController 需要在AdminController引入singer.php文件 require require_once include include_once均报错 这时候需要引入文件路径&#xff1a;require_once __DIR__ . /../signer.php;