每日一知识点 - Java Lambda 表达式

目录

  • 📝 每日一知识点
    • Lambda 表达式
      • 1、基本概念
      • 2、使用示例
  • 📎 参考文章

😀 准备好了吗?让我们一起步入这座Java神奇的城堡,揭开Java Lambda 表达式的神秘面纱,探索其中的奥秘。

📝 每日一知识点

Lambda 表达式

Lambda 表达式是Java 8 引入的一个重要特性,它提供了一种简洁的方式来表示函数式接口的实例。

1、基本概念

Lambda表达式本质上是一个匿名函数(匿名方法),可以将其作为参数传递给构造方法或者普通方法以便后续执行。

Lambda 表达式主要用于实现函数式接口。

函数式接口是只包含一个抽象方法的接口,可以使用@FunctionalInterface注解标记。Java 8提供了许多内置的函数式接口,如Runnable、Callable、Comparator等。

它由以下部分组成:

  • 参数列表 :圆括号内的参数,可以是空参数、一个参数或多个参数。

  • 箭头符号 :->

  • 函数体 :可以是一个表达式或一个代码块。

基本语法:

(参数列表) -> { 表达式体 }(parameters) -> { statements; }
//简易版 省略花括号 和 return 关键字
(parameters) -> expression

简化规则

  • 当参数列表为空时,必须保留空括号:() -> { … }

  • 当只有一个参数且可以推断类型时,可以省略参数的括号:a -> { … }

  • 当表达式体只有一行时,可以省略花括号:(a, b) -> a + b

  • 当表达式体只有一行且是返回语句时,可以省略return关键字:(a, b) -> a + b

示例

//a. 无参数的Lambda表达式:
Runnable runnable = () -> System.out.println("Hello, Lambda!");//b. 单参数的Lambda表达式:
Consumer<String> consumer = (name) -> System.out.println("Hello, " + name);//c. 多参数的Lambda表达式:
BinaryOperator<Integer> add = (a, b) -> a + b;

方法引用

方法引用是Lambda表达式的一种简化形式。

有四种类型的方法引用:

  • 静态方法引用: ClassName::staticMethodName

  • 实例方法引用: instanceName::methodName

  • 对象方法引用: ClassName::methodName

  • 构造方法引用: ClassName::new

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);

优点

  • 代码更加简洁

  • 提高代码的可读性

  • 支持函数式编程

  • 便于并行处理(如使用Stream API)

  1. 注意事项
  • Lambda表达式不能访问默认方法

  • 在Lambda表达式中,this关键字指向包含Lambda的方法的类实例

2、使用示例

1、线程创建

// 传统方式
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("传统方式创建的线程");}
}).start();// 使用Lambda表达式
new Thread(() -> System.out.println("使用Lambda表达式创建的线程")).start();

2、集合排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class SortExample {public static void main(String[] args) {List<String> names = new ArrayList<>();names.add("张三");names.add("李四");names.add("王五");// 传统方式Collections.sort(names, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.compareTo(s2);}});// 使用Lambda表达式Collections.sort(names, (s1, s2) -> s1.compareTo(s2));// 传统方式输出for (String name : names) {System.out.println(name);}// 使用Lambda表达式输出names.forEach(name -> System.out.println(name));}
}

3、函数式接口的使用

@FunctionalInterface
interface MathOperation {int operate(int a, int b);
}public class Calculator {public static void main(String[] args) {// 传统方式MathOperation traditionalAddition = new MathOperation() {@Overridepublic int operate(int a, int b) {return a + b;}};MathOperation traditionalSubtraction = new MathOperation() {@Overridepublic int operate(int a, int b) {return a - b;}};// 使用Lambda表达式MathOperation lambdaAddition = (a, b) -> a + b;MathOperation lambdaSubtraction = (a, b) -> a - b;// 使用操作System.out.println("传统方式 - 10 + 5 = " + operate(10, 5, traditionalAddition));System.out.println("Lambda表达式 - 10 + 5 = " + operate(10, 5, lambdaAddition));System.out.println("传统方式 - 10 - 5 = " + operate(10, 5, traditionalSubtraction));System.out.println("Lambda表达式 - 10 - 5 = " + operate(10, 5, lambdaSubtraction));}private static int operate(int a, int b, MathOperation mathOperation) {return mathOperation.operate(a, b);}
}

4、流操作

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<String> names = Arrays.asList("张三", "李四", "王五", "赵六", "田七");// 传统方式List<String> traditionalFilteredNames = new ArrayList<>();for (String name : names) {if (name.length() > 1) {traditionalFilteredNames.add("尊敬的" + name);}}// 使用流和Lambda表达式List<String> lambdaFilteredNames = names.stream().filter(name -> name.length() > 1).map(name -> "尊敬的" + name).collect(java.util.stream.Collectors.toList());// 传统方式输出System.out.println("传统方式结果:");for (String name : traditionalFilteredNames) {System.out.println(name);}// 使用Lambda表达式输出System.out.println("Lambda表达式结果:");lambdaFilteredNames.forEach(System.out::println);}
}

5、事件处理

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;public class EventHandlingExample extends Application {@Overridepublic void start(Stage primaryStage) {Button traditionalBtn = new Button("传统方式");Button lambdaBtn = new Button("Lambda表达式");// 传统方式traditionalBtn.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {System.out.println("传统方式:按钮被点击了!");}});// 使用Lambda表达式lambdaBtn.setOnAction(event -> System.out.println("Lambda表达式:按钮被点击了!"));// 布局和显示javafx.scene.layout.VBox root = new javafx.scene.layout.VBox(10);root.getChildren().addAll(traditionalBtn, lambdaBtn);Scene scene = new Scene(root, 200, 100);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

📎 参考文章

  • 二哥的进阶之路

  • 菜鸟教程

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

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

相关文章

PlatformIO+ESP32S3学习:驱动WS2812矩阵彩灯显示FFT音律拾音灯

本文继承自之前的彩灯驱动文章&#xff1a;https://blog.csdn.net/qq_51930953/article/details/140736628 本文完成的效果&#xff1a; 1. 硬件准备 1.1. WS2812矩阵彩灯 购买地址&#xff1a;WS2812B全彩软像素屏8X8 8X32 16X16幻彩5V显示可编程像素软屏 1.2. 麦克风模块 购…

Ip2region - 基于xdb离线库的Java IP查询工具提供给脚本调用

文章目录 Pre效果实现git clone编译测试程序将ip2region.xdb放到指定目录使用改进最终效果 Pre OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架 Ip2region - xdb java 查询客户端实现 效果 最终效果 实现 git clone git clone https://github.com/lionsou…

YOLOV8源码解读-C2f模块-以及总结c2模块、Bottleneck

c2f模块是对c2模块的改进 c2模块图解解读 先给出YOLOV8中卷积的定义模块一键三连-卷积-BN-激活函数 def autopad(k, pNone, d1): # kernel, padding, dilation"""Pad to same shape outputs."""if d > 1:k d * (k - 1) 1 if isinstance…

洛谷 P7771:【模板】欧拉路径

【题目来源】https://www.luogu.com.cn/problem/P7771【题目描述】 求有向图字典序最小的欧拉路径。【输入格式】 第一行两个整数 n,m 表示有向图的点数和边数。 接下来 m 行每行两个整数 u,v 表示存在一条 u→v 的有向边。【输出格式】 如果不存在欧拉路径&#xff0c;输出一行…

在模型中bert和transform讲解

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;BERT 和 Transformer 是两个非常重要的概念。下面是它们的简要解释&#xff1a; 一 、BERT BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google提出的一种预训练语言…

Docker与Kubernetes在Java微服务中的应用

引言 随着微服务架构的普及,容器化技术成为部署和管理微服务的重要手段。Docker 提供了一种轻量级的容器解决方案,而 Kubernetes 则成为了容器编排和管理的事实标准。本文将深入探讨如何将 Java 微服务容器化,并在 Kubernetes 上部署和管理这些服务。 容器化概述 1. 容器…

Linux:进程信号(二.信号的保存与处理、递达、volatile关键字、SIGCHLD信号)

上次介绍了&#xff1a;(Linux&#xff1a;进程信号&#xff08;一.认识信号、信号的产生及深层理解、Term与Core&#xff09;)[https://blog.csdn.net/qq_74415153/article/details/140624810] 文章目录 1.信号保存1.1递达、未决、阻塞等概念1.2再次理解信号产生与保存1.3信号…

Pytorch深度学习实践(9)卷积神经网络

卷积神经网络 全连接神经网络 神经网络中全部是线性模型&#xff0c;是由线性模型串联起来的 全连接网络又叫全连接层 卷积神经网络 在全连接神经网络中&#xff0c;由于输入必须是一维向量&#xff0c;因此在处理图像时必须要对图像矩阵进行拉伸成一维的形式&#xff0c;…

构建npm组件包并打包上传到npm官网

vitejsv3简略搭建&#xff08;笔记用&#xff09; 原作者&#xff1a;https://juejin.cn/post/7119827361092108301?searchId20240724094258A72138D981DC0419C33E 1.npm create vitelatest # 使用npm安装vite脚手架2.先install项目&#xff0c;然后改造&#xff1a;修改&…

【算法】布隆过滤器

一、引言 在现实世界的计算机科学问题中&#xff0c;我们经常需要判断一个元素是否属于一个集合。传统的做法是使用哈希表或者直接遍历集合&#xff0c;但这些方法在数据量较大时效率低下。布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&…

【NPU 系列专栏 2.8 -- 特斯拉 FDS NPU 详细介绍 】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 特斯拉 NPU 芯片介绍FSD(Full Self-Driving)芯片 简介FSD主要特点FSD 详细参数FSD 应用场景特斯拉 Hardware 3.0 芯片 简介Hardware 3.0主要特点Hardware 3.0 详细参数Hardware 3.0应用场景特斯拉自研 NPU 的优势优化设计高度…

【数学建模】——matplotlib简单应用

目录 1.绘制带有中文标签和图例的正弦和余弦曲线 2. 绘制散点图 1.修改散点符号与大小 2.修改颜色 3.绘制饼状图 4.在图例中显示公式 5.多个图形单独显示 6.绘制有描边和填充效果的柱状图 7.使用雷达图展示学生成绩 8.绘制三维曲面 9.绘制三维曲线 10.设置…

定制化即时通讯企业级移动门户解决方案,WorkPlus IM系统让工作事半功倍

随着移动设备的普及和移动办公的兴起&#xff0c;企业越来越需要一种定制化的即时通讯企业级移动门户解决方案来提高工作效率和团队协作效果。WorkPlus IM系统作为一种创新的解决方案&#xff0c;为企业提供了一个个性化定制、高度安全和高效便捷的移动门户平台。本文将对定制化…

BFF:优化前后端协作设计模式

BFF&#xff1a;优化前后端协作设计模式 BFF是什么 BFF即 Backends For Frontends (服务于前端的后端)。是一种介于前端和后端之间一种重要的通信设计模式。它旨在解决前端与后端协作中的复杂性问题。 背景 行业背景&#xff1a;传统前端应用&#xff08;如Web应用、移动应…

微服务-MybatisPlus下

微服务-MybatisPlus下 文章目录 微服务-MybatisPlus下1 MybatisPlus扩展功能1.1 代码生成1.2 静态工具1.3 逻辑删除1.4 枚举处理器1.5 JSON处理器**1.5.1.定义实体****1.5.2.使用类型处理器** **1.6 配置加密&#xff08;选学&#xff09;**1.6.1.生成秘钥**1.6.2.修改配置****…

网络安全防御【IPsec VPN搭建】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤&#xff1a; 修改双机热备的为主备模式&#xff1a; 2、配置交换机LSW6新增的配置&#xff1a; 3、防火墙&#xff08;FW4&#xff09;做相关的基础配置&#xff1a; 4、搭建IPsec VPN通道 &#xff08;1…

GLSL教程 第10章:高级渲染技术

目录 10.1 后处理效果 10.1.1 色彩校正 示例代码&#xff1a;色彩校正 解释&#xff1a; 10.1.2 亮度对比度调整 示例代码&#xff1a;亮度对比度调整 解释&#xff1a; 10.1.3 模糊效果 示例代码&#xff1a;高斯模糊 解释&#xff1a; 10.1.4 边缘锐化 示例代码&a…

Java代码基础算法练习-求杨辉三角第n行的值-2024.07.27

任务描述&#xff1a; 给定一个非负整数n&#xff0c;生成「杨辉三角」的第n行。&#xff08;1<n<10&#xff09;在「杨辉三角」中&#xff0c;每 个数是它左上方和右上方的数的和。 &#xff08;提示&#xff0c;第一列数值为1&#xff0c;如数组下标用i,j表示&#xf…

VoIP所在的协议层次

VoIP&#xff08;Voice over Internet Protocol&#xff09;本身不是一种协议&#xff0c;而是一种技术或通信方式。虽然VoIP技术本身不是协议&#xff0c;但它依赖于多种协议来实现其功能。所以&#xff0c;其并不严格地工作在网络通信的某一层&#xff0c;而是跨越了多个层次…

独占电脑资源来执行一个应用

1. 背景 在人工智能时代&#xff0c;随着神经网络的发展&#xff0c;训练人工智能模型需要越来越多的硬件资源&#xff0c;例如&#xff0c;利用10万条棋局数据、使用一台PC电脑、完整地训练一次确定性神经网络五子棋模型&#xff0c;需要花费一年半的时间。随着训练数据的增长…