Lambda 表达式的语法与使用:更简洁、更灵活的函数式编程!

全文目录:

    • 开篇语
    • Lambda 表达式的语法与使用:更简洁、更灵活的函数式编程
      • 一、Lambda 表达式的语法
        • 1.1 Lambda 表达式的基本语法形式
      • 二、Lambda 表达式的使用
        • 2.1 Lambda 表达式与匿名内部类的对比
          • 代码示例:使用匿名内部类和 Lambda 表达式实现 `Runnable` 接口
        • 2.2 Lambda 表达式与函数式接口
          • 代码示例:自定义函数式接口
      • 三、常用的 Lambda 表达式场景
        • 3.1 在集合框架中的使用
          • 代码示例:使用 Lambda 表达式遍历集合
        • 3.2 过滤与映射
          • 代码示例:使用 Lambda 表达式过滤与映射
        • 3.3 排序操作
          • 代码示例:使用 Lambda 表达式排序
      • 四、函数式编程与 Lambda 表达式
        • 4.1 `Function` 接口
          • 代码示例:使用 `Function` 接口
        • 4.2 `Predicate` 接口
          • 代码示例:使用 `Predicate` 接口
        • 4.3 `Consumer` 接口
          • 代码示例:使用 `Consumer` 接口
      • 五、总结:Lambda 表达式的优势与应用
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

Lambda 表达式的语法与使用:更简洁、更灵活的函数式编程

  Lambda 表达式是 Java 8 引入的一个强大特性,它使得 Java 更加简洁、灵活,尤其是在处理集合、事件和回调时,能够以更加函数式的方式表达代码。Lambda 表达式的引入是 Java 语言的一次重大变革,它不仅让代码更加简洁,也增强了 Java 语言的表达力和可维护性。

一、Lambda 表达式的语法

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

(parameters) -> expression

其中:

  • parameters:表示传递给 Lambda 表达式的参数,类似于方法的参数列表。
  • ->:Lambda 操作符,用于将参数列表与方法体分隔开。
  • expression:Lambda 表达式的主体,表示 Lambda 执行的代码。它可以是单行的表达式,也可以是包含多行的代码块。
1.1 Lambda 表达式的基本语法形式
  1. 无参数,返回值为空

    () -> System.out.println("Hello, World");
    

    这表示一个没有参数且执行简单操作的 Lambda 表达式。

  2. 一个参数,返回值

    x -> x * x
    

    这是一个接受单个参数并返回其平方的 Lambda 表达式。

  3. 多个参数

    (x, y) -> x + y
    

    这是一个接受两个参数并返回它们和的 Lambda 表达式。

  4. 包含代码块

    (x, y) -> {int sum = x + y;return sum;
    }
    

    这是一个包含多行代码的 Lambda 表达式,其中 return 用于返回结果。


二、Lambda 表达式的使用

Lambda 表达式可以应用于任何需要函数式接口的场景,函数式接口是只包含一个抽象方法的接口。例如,Java 提供的 RunnableCallableComparator 等接口都可以使用 Lambda 表达式来实现。

2.1 Lambda 表达式与匿名内部类的对比

在 Java 中,Lambda 表达式常常用来替代匿名内部类,尤其是在实现接口时。与匿名内部类相比,Lambda 表达式更加简洁。

代码示例:使用匿名内部类和 Lambda 表达式实现 Runnable 接口

匿名内部类实现

public class RunnableExample {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello from anonymous class");}};new Thread(runnable).start();}
}

Lambda 表达式实现

public class RunnableExample {public static void main(String[] args) {Runnable runnable = () -> System.out.println("Hello from Lambda");new Thread(runnable).start();}
}

  在这个例子中,使用 Lambda 表达式代替匿名内部类,使得代码更加简洁。

2.2 Lambda 表达式与函数式接口

Lambda 表达式的目标是函数式接口。一个接口如果只包含一个抽象方法,就称为函数式接口。例如,RunnableCallableComparator 都是函数式接口。

代码示例:自定义函数式接口
@FunctionalInterface
interface Calculator {int add(int a, int b);
}public class LambdaExample {public static void main(String[] args) {// 使用 Lambda 表达式实现函数式接口Calculator calculator = (a, b) -> a + b;System.out.println("Sum: " + calculator.add(5, 3));}
}

  在这个例子中,我们定义了一个 Calculator 函数式接口,它有一个 add 方法。然后,我们使用 Lambda 表达式来实现 add 方法。


三、常用的 Lambda 表达式场景

3.1 在集合框架中的使用

Lambda 表达式特别适用于集合框架(如 ListSetMap)的操作,常见的操作包括遍历、过滤、排序等。Java 8 引入的 Stream API 使得对集合的操作更加直观。

代码示例:使用 Lambda 表达式遍历集合
import java.util.Arrays;
import java.util.List;public class LambdaForEachExample {public static void main(String[] args) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry");// 使用 Lambda 表达式遍历集合list.forEach(item -> System.out.println(item));}
}

  在这个例子中,我们使用 forEach 方法和 Lambda 表达式遍历列表,并打印每个元素。

3.2 过滤与映射

通过 Stream API,Lambda 表达式还可以用于对集合元素的过滤、映射和聚合操作。

代码示例:使用 Lambda 表达式过滤与映射
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class LambdaFilterMapExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 使用 Lambda 表达式过滤偶数,并将每个数乘以 2List<Integer> result = numbers.stream().filter(n -> n % 2 == 0).map(n -> n * 2).collect(Collectors.toList());System.out.println(result);  // 输出:[4, 8, 12]}
}

  在这个例子中,我们使用 filter() 方法来过滤偶数,使用 map() 方法将每个数乘以 2,然后通过 collect() 方法将结果转换成一个新的列表。

3.3 排序操作

Lambda 表达式还可以与 Comparator 一起使用,简化排序操作。

代码示例:使用 Lambda 表达式排序
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;public class LambdaSortExample {public static void main(String[] args) {List<String> list = Arrays.asList("Banana", "Apple", "Cherry");// 使用 Lambda 表达式进行排序list.sort((a, b) -> a.compareTo(b));  // 升序排序System.out.println(list);  // 输出:[Apple, Banana, Cherry]}
}

  在这个例子中,我们使用 sort() 方法和 Lambda 表达式来对字符串列表进行排序。


四、函数式编程与 Lambda 表达式

Lambda 表达式是 Java 函数式编程的核心,允许我们将函数作为参数传递并返回。Java 8 的 FunctionPredicateConsumerSupplier 等接口是函数式编程的关键组成部分。

4.1 Function 接口

Function 接口代表接受一个参数并返回一个结果的函数。

代码示例:使用 Function 接口
import java.util.function.Function;public class FunctionExample {public static void main(String[] args) {Function<String, Integer> stringLength = str -> str.length();System.out.println(stringLength.apply("Hello"));  // 输出:5}
}
4.2 Predicate 接口

Predicate 接口用于判断某个条件是否成立。

代码示例:使用 Predicate 接口
import java.util.function.Predicate;public class PredicateExample {public static void main(String[] args) {Predicate<Integer> isEven = n -> n % 2 == 0;System.out.println(isEven.test(4));  // 输出:true}
}
4.3 Consumer 接口

Consumer 接口表示接受一个参数并执行某些操作,但不返回结果。

代码示例:使用 Consumer 接口
import java.util.function.Consumer;public class ConsumerExample {public static void main(String[] args) {Consumer<String> print = str -> System.out.println(str);print.accept("Hello, World!");  // 输出:Hello, World!}
}

五、总结:Lambda 表达式的优势与应用

Lambda 表达式使 Java 的代码更加简洁、清晰和函数式。通过 Lambda 表达式,我们能够:

  • 简化匿名内部类的使用,特别是在实现函数式接口时。
  • 与 Stream API 一起,使得对集合的操作(如过滤、映射、排序等)更加简洁和高效。
  • 提高代码的可读性和可维护性。

Lambda 表达式在 Java 8 中的引入是 Java 语言的一次重大改进,它使得 Java 更加符合现代编程范式,尤其是在处理集合和事件时,能够提供更简洁、直观的表达方式。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

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

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

相关文章

从0到1开发一个自己的工具 MCP 并发布到 test PyPi(Python个人版)

目录 1. 我理解的 MCP2. 写一个自己的MCP然后发布到 PyPi 上&#xff0c;包括加法工具和获取当前 ip 工具2.1 先碎碎念一下 uv2.2 初始化项目&#xff08;全程在 cmd 下运行命令&#xff09;2.3 添加 mcp 依赖2.4 添加 server.py&#xff0c;先把加法功能添加上2.5 运行并测试加…

RabbitMQ缓存详解:由来、发展、核心场景与实战应用

一、RabbitMQ的由来与发展历程 1.1 RabbitMQ的诞生背景 RabbitMQ诞生于金融行业的需求,最初由Rabbit Technologies Ltd开发,后被SpringSource收购,最终成为Pivotal的一部分。它的设计初衷是为了解决分布式系统中消息可靠传输的问题。在早期金融交易系统中,系统间的通信需…

机器学习与深度学习18-线性代数01

目录 前文回顾1.特征向量和特征值2.矩阵与模型3.内积和外积4.向量的范数5.正交矩阵 前文回顾 上一篇文章地址&#xff1a;链接 1.特征向量和特征值 在机器学习中&#xff0c;特征向量和特征值是用于描述数据集中的特征或变量之间关系的重要概念。它们在降维技术&#xff08;…

如何让 VS Code 仅通过滚轮放大字体,而不缩放整个界面?

在 VS Code 中&#xff0c;默认情况下使用 Ctrl滚轮&#xff08;Windows/Linux&#xff09;或 Cmd滚轮&#xff08;Mac&#xff09;会同时缩放整个界面&#xff08;包括 UI 元素和编辑器字体&#xff09;。如果你希望仅放大编辑器字体而不影响界面缩放&#xff0c;可以通过以下…

Vue3中v-bind指令用法详解

在 Vue 3 中&#xff0c;v-bind 是一个核心指令&#xff0c;用于动态绑定 HTML 属性或组件的 props 到 Vue 实例的数据。以下是详细讲解&#xff1a; 一、基础用法 1. 绑定单个属性 vue 复制 下载 <template><!-- 绑定 img 的 src 属性 --><img v-bind:src…

算法题(169):最大子段和(分治思想)

审题&#xff1a; 本题需要我们找到区间的最大子段和并输出结果 思路&#xff1a; 方法一&#xff1a;分治思想 我们可以把给定区间平均分成两部分&#xff0c;然后获取左段区间的最大子段和&#xff0c;右段区间的最大子段和&#xff0c;以及跨区间的最大子段和。最后比较出他…

Linux 线程深度解析:从内存管理到线程控制的核心机制

文章目录 引言一、Linux 线程概念1.1 什么是线程1.2 分页式存储管理1.2.1 虚拟地址和页表的由来1.2.2 物理内存管理struct page 的主要用途 1.2.3 页表1.2.4 页目录结构1.2.5 两级页表的地址转换1.2.6 缺页异常 1.3 线程的优点1.4 线程缺点1.5 线程异常1.6 线程用途 二、Linux进…

玩转计算机视觉——按照配置部署paddleOCR(英伟达环境与昇腾300IDUO环境)

英伟达环境安装 创建虚拟环境 conda create -n paddleOCR python3.10 -y conda activate paddleOCRconda install jupyterlab -y conda install ipykernel -y python -m ipykernel install --user --name paddleOCR --display-name "paddle OCR"下载PaddleOCR的GPU…

Java机器学习全攻略:从基础原理到实战案例详解

在当今AI驱动的技术浪潮中,机器学习已成为Java开发者必须掌握的核心技能之一。本文将系统性地介绍Java机器学习的原理基础、常用框架,并通过多个实战案例展示如何在实际项目中应用这些技术。无论你是刚接触机器学习的Java开发者,还是希望巩固基础的中级工程师,这篇文章都将…

eBPF 技术详解及其在网络安全领域的应用与挑战

摘要 eBPF&#xff08;extended Berkeley Packet Filter&#xff09;是 Linux 内核中的一项革命性技术&#xff0c;它允许用户在不修改内核代码或加载内核模块的情况下&#xff0c;安全、高效地运行自定义程序。eBPF 的出现极大地扩展了 Linux 内核的可编程性&#xff0c;使其…

error:MISCONF Redis is configured to save RDB snapshots

一、背景 在使用redis异步驱动方式下&#xff0c;执行hset指令时&#xff0c;报错 redisAsyncCommand((redisAsyncContext *)c, dumpReply, "hset role:10001", "hset role:10001 name %s age %d sex %s", "mark", 31, "male");二、原…

Android-Mod-Menu 使用教程

目录 简介前提条件安装步骤1. 下载和解压项目2. 配置 Android Studio3. 安装到设备 修改游戏 APK1. 确定游戏主活动2. 集成模组菜单方法 1&#xff1a;通过服务启动&#xff08;推荐&#xff09;方法 2&#xff1a;通过活动启动&#xff08;仅在游戏检测模组时使用&#xff09;…

SpringBoot 自动化部署实战:从环境搭建到 CI/CD 全流程

SpringBoot 自动化部署全流程实战 一、环境准备&#xff08;开发侧&#xff09; 基础工具链安装&#xff1a; # JDK 17 brew install openjdk17 # Maven 构建工具 brew install maven # Docker 环境 brew install --cask docker项目配置验证&#xff1a; <!-- pom.xml 关…

Flutter动画与交互:打造流畅用户体验的完整指南

在移动应用开发中&#xff0c;流畅的动画和自然的交互是提升用户体验的关键因素。Flutter作为Google推出的跨平台UI工具包&#xff0c;提供了一套强大而灵活的动画系统&#xff0c;使开发者能够轻松创建专业级的动画效果。本文将深入探讨Flutter中的动画与交互技术&#xff0c;…

山东大学软件学院项目实训:基于大模型的模拟面试系统项目总结(九)

在山东大学软件学院的项目实训中&#xff0c;团队成员们围绕基于大模型的模拟面试系统展开了一系列开发与优化工作。以下是本周项目的核心进展与成果总结。 前端界面优化与 Bug 修复&#xff08;吴尤&#xff09; Logo 显示问题修复 在项目开发过程中&#xff0c;团队发现项…

14.vue.js的watch()的注意事项(1)

一、 Q &#xff1a;因为 state 有内部的属性 也就是id。 因为要追逐id。所以要写函数&#xff1f;而不能直接监听state。 只监听state &#xff0c;监听不到id的变化吗&#xff1f; A&#xff1a; 为什么监听 state 不等于监听 state.id&#xff1f; 在 Vue 3 中&#xff0…

强化学习入门:价值、回报、策略概念详解

前言 最近想开一个关于强化学习专栏&#xff0c;因为DeepSeek-R1很火&#xff0c;但本人对于LLM连门都没入。因此&#xff0c;只是记录一些类似的读书笔记&#xff0c;内容不深&#xff0c;大多数只是一些概念的东西&#xff0c;数学公式也不会太多&#xff0c;还望读者多多指教…

基于“数智立体化三维架构”框架的医疗数智化机制研究

1 研究背景与框架基础 当前,全球医疗服务体系正经历深刻的数智化转型浪潮,人工智能、大数据、云计算等新一代信息技术与医疗健康领域的融合不断深入,催生了医疗服务模式的革命性变化。在我国,数智化技术已成为提升基层卫生服务质量、促进医疗服务公平可及、增进百姓健康福…

OpenCV CUDA模块图像变形------对图像进行旋转操作函数rotate()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于对图像进行 GPU 加速的旋转操作&#xff0c;支持指定旋转角度、缩放中心偏移和插值方法。是 OpenCV CUDA 模块中用于图像旋转的核心函…

【面板数据】中国与世界各国新能源汽车进出口数据-分类别与不分类别(2017-2024年)

新能源汽车作为中国制造高质量发展的重要代表&#xff0c;其进出口数据不仅反映了我国技术实力与产业格局的变化&#xff0c;也是理解全球绿色交通趋势、制定国家战略决策的重要依据。目前国内主流定义判断标准主要参考中国工信部于2009年发布的《新能源汽车生产企业及产品准入…