深入理解Java中的Lambda表达式

Java 8引入的Lambda表达式(或称匿名函数)是一种简洁优雅的语法,极大简化了开发者编写代码的方式。它可以作为参数传递给方法或赋值给变量,适用于简化代码的场景。本文将详细介绍Lambda表达式的使用,并结合代码实例进行讲解。

什么是Lambda表达式?

Lambda表达式是一种函数式接口的简化表示,它是一段没有名字的、可以直接传递的代码。通过Lambda表达式,我们可以更方便地实现函数式编程。它的基本语法如下:

(parameters) -> expression(parameters) -> { statements }
参数部分:
  • 可以是一个或多个参数,参数类型可以省略。
  • 如果参数只有一个且无类型,可以省略圆括号。
  • 如果参数为空,使用空括号()
箭头符号->
  • 用于将参数和Lambda表达式主体部分分开。
主体部分:
  • 一个表达式或代码块。
  • 如果是表达式,默认返回值。
  • 如果是代码块,则需要显式使用return返回值。

Lambda表达式对接口的要求

为了能够被Lambda表达式表示,接口必须符合特定的要求:必须是一个函数式接口。一个函数式接口是一个只有一个抽象方法的接口。Java 8引入的@FunctionalInterface注解可以用于标识此类接口。如果开发者试图在标记为@FunctionalInterface的接口中添加额外的抽象方法,编译器将会报错。这保证了Lambda表达式可以被正确地映射到接口的抽象方法。

代码实例:

基础示例:一个简单的Lambda表达式例子,直接返回传入参数的平方值。

import java.util.function.Function;public class LambdaDemo {public static void main(String[] args) {// 使用Function接口Function<Integer, Integer> square = (Integer x) -> x * x;System.out.println(square.apply(5));  // 输出:25}
}

简化语法:如果参数只有一个且不带类型,可以进一步简化

Function<Integer, Integer> square = x -> x * x;

使用预定义函数式接口:Java 8引入了一系列预定义的函数式接口,如FunctionPredicateConsumerSupplier。以下是一个使用Predicate接口的示例:

import java.util.function.Predicate;public class LambdaDemo {public static void main(String[] args) {Predicate<String> isLongerThan5 = s -> s.length() > 5;System.out.println(isLongerThan5.test("Hello"));    // 输出:falseSystem.out.println(isLongerThan5.test("HelloWorld")); // 输出:true}
}

自定义函数式接口:除了使用预定义接口,还可以自定义自己的函数式接口。需要使用@FunctionalInterface注解,以确保接口只有一个抽象方法。

@FunctionalInterface
interface MathOperation {int operate(int a, int b);
}public class LambdaDemo {public static void main(String[] args) {MathOperation addition = (a, b) -> a + b;MathOperation multiplication = (a, b) -> a * b;System.out.println("Addition: " + addition.operate(10, 5));         // 输出:15System.out.println("Multiplication: " + multiplication.operate(10, 5)); // 输出:50}
}

Lambda表达式的应用场景

集合操作:借助Java 8新增的Stream API,Lambda表达式可以用于简化集合的操作。

import java.util.Arrays;
import java.util.List;public class StreamDemo {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 使用Lambda表达式和Stream过滤集合names.stream().filter(name -> name.startsWith("C")).forEach(System.out::println);  // 输出:Charlie}
}

事件监听:在GUI编程中,Lambda表达式可以简化事件监听器的代码编写。

import javax.swing.JButton;
import javax.swing.JFrame;public class EventListenerDemo {public static void main(String[] args) {JFrame frame = new JFrame("Lambda Listener");JButton button = new JButton("Click Me");// 使用Lambda表达式为按钮添加点击事件监听器button.addActionListener(e -> System.out.println("Button clicked!"));frame.add(button);frame.setSize(300, 200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}
}

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

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

相关文章

C语言 void 指针就是空指针吗?它有什么作⽤?

一、问题 这是⼀个在⾯试时很容易出现的问题&#xff0c;但是也是很多⼈混淆的问题&#xff0c;这个问题如何回答&#xff1f; 二、解答 void 指针⼀般称为通⽤指针&#xff0c;要与空指针严格区分。void 指针⽤于指向⼀个不属于任 何类型的对象&#xff0c;所以 void 指针称为…

k8s集群安装

目录 部署步骤概览 1、基础环境部署 2、docker环境部署 3、配置k8s集群 4、集群初始化 5、安装dashboard软件 写在前面&#xff1a;本文安装单点master多node的k8s集群&#xff0c;主要用于k8s学习或k8s环境测试&#xff1b;部署的是1.23版本&#xff0c;在1.24版本起&am…

什么是TCP粘包?

TCP粘包 数据的接收和发送是无关的&#xff0c;read()/recv() 函数不管数据发送了多少次&#xff0c;都会尽可能多的接收数据。也就是说&#xff0c;read()/recv() 和 write()/send() 的执行次数可能不同。 举个栗子 write()/send() 重复执行三次&#xff0c;每次都发送字符…

stm32单片机开发四、USART“串口通信“

串口的空闲状态时高电平&#xff0c;起始位是低电平&#xff0c;来打破空闲状态的高电平 必须要有停止位&#xff0c;停止位一般为一位高电平 串口常说的数据为8N1&#xff0c;其实就是8个数据位&#xff08;固定的&#xff09;&#xff0c;N就是none&#xff0c;也就是0个校验…

【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解

一、计算机网络的发展背景 1、网络的定义 网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来&#xff0c;形成一个相互通信和共享资源的系统。 &#xff08;1&#xff09; 独立模式 独立模式 &#xff1a; 计算机之间相互独立。 &#xff08;2&#xff09;…

数据结构——二叉树链式结构的实现(下)

二叉树找值找为x的结点 找值不简单吗&#xff1f;轻轻松松拿捏&#xff0c;大部分同学都会写出这样的代码 但这种代码有问题&#xff0c;因为没有把查找结果返回给上一层&#xff0c;没有用返回值接收。 当找到3时返回给了上一层&#xff0c;但并没有用返回值接收&#xff0c;…

游戏名台词大赏

文章目录 原神&#xff08;圈内&#xff09; 崩坏&#xff1a;星穹铁道&#xff08;圈内&#xff09; 崩坏3&#xff08;圈内&#xff09; 原神 只要不失去你的崇高&#xff0c;整个世界都会为你敞开。 总会有地上的生灵&#xff0c;敢于直面雷霆的威光。 谁也没有见过风&…

Rust 生命周期浅谈

1. 简述 Rust 中的每一个引用都有其 生命周期&#xff08;lifetime&#xff09;&#xff0c;也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的&#xff0c;正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型&#xff0c;…

Arxml文件解析02- 自动驾驶Radar服务radar_svc.arxml

<AUTOSAR xmlns="http://autosar.org/schema/r4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://autosar.org/schema/r4.0 AUTOSAR_00045.xsd

大数据面试题(九):Hive的高频面试考点(值得收藏)

文章目录 Hive的高频面试考点 一、Hive中两个大表实现join的操作,简单描述一下

书接上文,助力智能化诊断高质提效,基于轻量级CNN模型MobileNet开发构建人体手骨X光骨骼骨龄分析识别系统

骨龄是骨骼年龄的简称&#xff0c;需要借助于骨骼在X光摄像中的特定图像来确定。通常要拍摄左手手腕部位的X光片&#xff0c;医生通过X光片观察来确定骨龄。这在临床上是一件非常消耗精力和时间的一项放射临床工作。写一个骨龄可能要10多分钟去完成。如果一天要写几十个骨龄&am…

WPF中DispatchHelper

在WPF应用中&#xff0c;Dispatcher 是一个非常重要的概念&#xff0c;它帮助我们在正确的线程&#xff08;通常是UI线程&#xff09;上执行代码&#xff0c;这对于需要访问或更新UI元素的任务至关重要。由于WPF应用中的UI只能从UI线程进行访问&#xff0c;因此当你在后台线程上…

【汇编语言】中断及外部设备操作

【汇编语言】中断及外部设备操作 文章目录 【汇编语言】中断及外部设备操作前言一、中断及其处理中断的概念8086内中断中断处理程序案例&#xff1a;系统中的0号中断中断过程 二、编制中断处理程序中断处理程序及其结构编制中断处理程序——以除法错误中断为例do0子程序应该放在…

基础I/O--文件系统

文章目录 回顾C文件接口初步理解文件理解文件使用和并认识系统调用open概述标记位传参理解返回值 closewriteread总结 文件描述符fd0&1&2理解 回顾C文件接口 C代码&#xff1a; #include<stdio.h> int main() { FILE *fpfopen("log.txt",&…

《MySQL45讲》读书笔记

重建表 alter table t engine InnoDB&#xff08;也就是recreate&#xff09;&#xff0c;而optimize table t 等于recreateanalyze&#xff0c;让表大小变小 重建表的执行流程 建立一个临时文件&#xff0c;扫描表 t 主键的所有数据页&#xff1b;用数据页中表 t 的记录生…

python print 越来越优雅

在Python中&#xff0c;print() 是一个内置函数&#xff0c;用于将指定的字符串或变量的值输出到控制台&#xff0c;虽然简单&#xff0c;但却很有用&#xff0c;而且它一直在进步&#xff0c;我们来看看代码深切体会一下&#xff1a; # 打印简单的字符串 print("Hello, …

【升级U8+】不能将值 NULL 插入列 ‘LocaleID‘,表 ‘hr_bd_vouchertype_Base‘;列不允许有 Null 值。

【升级错误】 C:\U8SOFT\Admin\SQLFILE8710\Main\Ufdata\data\NL\data_data_hr_pr_mix_nl.sql 错误信息: -2147217873 不能将值 NULL 插入列 ‘LocaleID’,表 ‘UFDATA_101_2013.dbo.hr_bd_vouchertype_Base’;列不允许有 Null 值。INSERT 失败。 执行如下语句时出错: inse…

JSON.parse() 和 JSON.stringify()的用法

介绍 JSON.parse() 和 JSON.stringify() 是 JavaScript 中用于处理 JSON 格式数据的两个核心方法。 JSON.parse(): 用于将 JSON 字符串解析为 JavaScript 对象。JSON.stringify(): 用于将 JavaScript 对象转换为 JSON 字符串。 JSON.parse() JSON.parse() 方法将 JSON 字符…

mac通过termius连接Linux服务器

mac上安装 linux系统 如果有 linux服务器账号密码&#xff0c;那么上一步可忽略&#xff1b; 比如&#xff1a;直接连接阿里云或腾讯云账号 1. 安装termius 链接: https://pan.baidu.com/s/1iYsZPZThPizxqtkLPT89-Q?pwdbw6j 提取码: bw6j 官网 Termius - SSH platform for …

【C++】STL — vector的接口讲解 +详细模拟实现

前言: 本章我们将学习STL中另一个重要的类模板vector… vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。但是又不像数组&#xff0c;它的大小是可以动态改变的本质讲&#xff0c;vector使用动态分配数组来存储它的元素v…