Java基础之lambda表达式(五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Java基础之lambda表达式

2.java lambda表达式介绍

  • Java的Lambda表达式是Java 8引入的一种新特性,允许我们以更简洁的方式表示匿名函数。Lambda表达式可以看作是一种简洁的、函数式编程风格的代码块。

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

(parameter-list) -> { function-body }

parameter-list:表示输入参数列表
->:表示Lambda运算符
function-body:表示是Lambda函数体。

以下是一些Lambda表达式的例子:

1.无参数Lambda表达式:

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

2.单个参数的Lambda表达式(参数类型可以省略):

x -> { System.out.println(x); }

3.多个参数的Lambda表达式:

(x, y) -> { System.out.println(x + y); }

4.当Lambda函数体只有一条语句时,可以省略大括号和return关键字:

(x, y) -> x + y

Lambda表达式通常与函数式接口一起使用,例如Java的Runnable,Comparator等接口。从Java 8开始,接口可以有默认方法和静态方法,这使得接口可以包含实现,从而可以像类一样使用。如果一个接口只有一个抽象方法,那么这个接口就是一个函数式接口。

例如,使用Lambda表达式和函数式接口Comparator进行排序:

List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);  Collections.sort(numbers, (a, b) -> a - b);  System.out.println(numbers);

在这个例子中,(a, b) -> a - b就是一个Lambda表达式,它实现了Comparator接口的compare方法,用于比较两个整数的大小。

3.Java Lambda 表达式

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

Lambda 表达式语法
lambda 表达式的语法格式如下:
方式一:
(parameters) -> expression方式二:
(parameters) ->{ statements; }

**
parameters:表示参数列表。
expression 或 { statements; } :表示Lambda 表达式的主体。
如果只有一个参数,可以省略括号;
如果没有参数,也需要空括号。
**

Lambda 表达式的简单例子:1. 不需要参数,返回值为3
() -> 3  2. 接收一个参数,返回其3倍的值  
x -> 3 * x  3. 接受2个参数,并返回他们的差值  
(x, y) -> x – y  4. 接收2int型整数,返回他们的和  
(int x, int y) -> x + y  5. 接受一个String 对象,并打印,不返回任何值
(String s) -> System.out.print(s)

4.lambda表达式代码实例

v1.0

public class Test {public static void main(String args[]){SAY say = message -> System.out.println("Hello " + message);say.print("Friends.");}interface SAY {void print(String message);}
}
注释:
message 是一个字符串(String)类型的参数。它是SAY接口中print方法的参数。
代码中的 message -> System.out.println("Hello " + message); 是一个Lambda表达式,它创建了一个实现了SAY接口的匿名类实例。
这个Lambda表达式实现了print方法,当调用print方法并传入一个字符串参数时,它会打印出"Hello ",后跟传入的字符串参数。具体来说,message -> System.out.println("Hello " + message); 这个Lambda表达式的意思是:
message 是这个Lambda表达式的参数,它的类型由print方法的定义决定,即String类型。
System.out.println("Hello " + message); 是这个Lambda表达式的主体,它实现了print方法的功能,即打印出"Hello "后跟message的值。

v2.0

  • Lambda表达式的固定语法:
(parameter-list) -> { function-body }
public class Test1 {interface SAY {void print(int mess);}interface ADD {void add(int a, int b);}public static void main(String args[]){//v1.0//SAY say = (message) -> System.out.println("Hello " + message);SAY say = (message) -> {System.out.println("Hello " + message);};say.print(1234);//v2.0//ADD at = (a, b) -> System.out.println("a = " + a + " b = " +b);ADD at = (a, b) -> {System.out.println("a = " + a + " b = " + b);};at.add(12,34);}
}

(message):表示参数.
->: 表示Lambda运算符.
{System.out.println("Hello " + message);};:表示函数体.
say:表示SAY类的对象.

ADD接口和lambda表达式本质解释:

ADD at = (a, b) -> {System.out.println("a = " + a + " b = " + b);}; 是一个赋值语句。这行代码做了以下几件事:
定义了一个名为 at 的变量,它的类型是 ADD。
ADD 是一个函数式接口,它有一个抽象方法 add(int a, int b)。
使用 Lambda 表达式 (a, b) -> {System.out.println("a = " + a + " b = " + b);} 来创建 ADD 接口的一个实例。
这个 Lambda 表达式实现了 ADD 接口的 add 方法。(a, b) 是参数列表,表示 add 方法接受两个整数参数。
-> 是 Lambda 运算符,它分隔了参数列表和 Lambda 函数体。
{System.out.println("a = " + a + " b = " + b);} 是 Lambda 函数体,它包含了要执行的代码。
在这个例子中,代码是打印参数 a 和 b 的值。
最后,这个 Lambda 表达式创建的 ADD 接口实例被赋值给变量 at。因此,ADD at = (a, b) -> {System.out.println("a = " + a + " b = " + b);}; 是一行赋值语句,
它创建了一个 ADD 类型的对象(实际上是一个 Lambda 表达式),并将其赋值给变量 at。
之后,你可以通过调用 at.add(12, 34); 来执行这个 Lambda 表达式,它会打印出 a = 12 b = 34。

问题:既然是(a, b) -> {System.out.println("a = " + a + " b = " + b);};实现了接口类ADD的方法add,那么为什么可以将(a, b) -> {System.out.println("a = " + a + " b = " + b);};赋值给at对象,而不是add方法呢?

你是在创建一个ADD类型的对象(即一个函数式接口的实例),并将这个Lambda表达式(实现了add方法的实例)赋值给变量at。
这里,at是一个函数式接口的引用,而不是一个方法的引用。在Java中,方法的调用是通过对象(或类的静态上下文)来完成的。
因此,当你调用at.add(12, 34);时,你实际上是在通过at这个对象(即函数式接口的实例)来调用add方法,
而这个方法是由Lambda表达式提供的实现。简而言之,(a, b) -> {System.out.println("a = " + a + " b = " + b);}这个Lambda表达式创建了一个匿名类,
这个匿名类实现了ADD接口,并重写了add方法。然后,这个匿名类的实例被赋值给了at变量。
当你调用at.add(12, 34);时,你实际上是在调用这个匿名类实例的add方法。

v3.0

emacs SimpleLambdaExample.java

public class SimpleLambdaExample {public static void main(String[] args) {// Lambda 表达式:带有参数和返回值Calculator addOperation = (a, b) -> a + b;// 调用 Lambda 表达式int result = addOperation.calculate(5, 3);// 打印结果System.out.println("Result: " + result);}// 函数式接口定义@FunctionalInterfaceinterface Calculator {int calculate(int a, int b);}
}

编译:
javac SimpleLambdaExample.java
javac SimpleLambdaExample

v4.0

// CarServiceProviderExample.java// 导入必要的类
import java.util.ArrayList;
import java.util.List;// 定义 Car 类
class Car {private String model;// Car 类的构造方法public Car(String model) {this.model = model;}// 获取汽车型号的方法public String getModel() {return model;}
}// 定义 CarServiceProvider 类
class CarServiceProvider {// 存储 CarListener 实例的列表private List<CarListener> listeners = new ArrayList<>();// 添加 CarListener 到列表的方法public void addListener(CarListener listener) {listeners.add(listener);}// 通知所有监听器有关 Car 对象的方法public void notifyListeners(Car car) {// 遍历监听器列表,并为每个调用 onCarEvent 方法for (CarListener listener : listeners) {listener.onCarEvent(car);}}
}// 定义 CarListener 的函数式接口
@FunctionalInterface
interface CarListener {// 监听器必须实现的抽象方法void onCarEvent(Car car);
}// 主例程
public class CarServiceProviderExample {public static void main(String[] args) {// 创建 CarServiceProvider 实例CarServiceProvider carServiceProvider = new CarServiceProvider();// 使用 lambda 表达式添加一个 CarListenercarServiceProvider.addListener(car -> {// 当接收到事件时打印消息System.out.println("收到汽车型号:" + car.getModel());});// 创建一个模拟的 Car 对象,型号为 "特斯拉"Car simulatedCar = new Car("特斯拉");// 通知监听器有关模拟汽车事件carServiceProvider.notifyListeners(simulatedCar);}
}

编译:
javac CarServiceProviderExample.java
javac CarServiceProviderExample

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

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

相关文章

C# If与Switch的区别

在 switch 语句中使用表达式比较时&#xff0c;编译器会生成一个查找表&#xff0c;其中包含所有表达式的值和对应的 case 标签。因此&#xff0c;与使用常量或字面量比较相比&#xff0c;使用表达式比较可能会略微降低性能。 只有当 switch 语句中的所有 case 标签都使用常量或…

Java编程实战:构建医疗信息管理新平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【C++私房菜】面向对象中的多态

文章目录 一、多态二、对象的静态类型和动态类型三、虚函数和纯虚函数1、虚函数2、虚析构函数3、抽象基类和纯虚函数4、多态的原理 四、重载、覆盖(重写)、隐藏(重定义)的对比 一、多态 OOP的核心思想是多态性(polymorphism)。多态性这个词源自希腊语&#xff0c;其含义是“多…

基于MPPT最大功率跟踪算法的涡轮机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪算法的涡轮机控制系统simulink建模与仿真.mppt采用爬山法实现&#xff0c;仿真输出MPPT控制效果&#xff0c;功率&#xff0c;转速等。 2.系统仿真结果 …

ELK入门(四)-logstash

Logstash Logstash 是开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的存储库中。 Logstash 能够动态地采集、转换和传输数据&#xff0c;不受格式或复杂度的影响。利用 Grok 从非结构化数据中…

电脑开机蓝屏错误代码c000021a怎么办 电脑蓝屏报错c000021a的解决办法

很多小伙伴在电脑开机的时候出现蓝屏代码c000021a都不知道该怎么去解决&#xff0c;所以今天就给你们带来了c000021a蓝屏解救方法&#xff0c;如果你还没解决的话就快来看看吧。 解决办法&#xff1a; 原因&#xff1a; c000021a蓝屏的原因有很多&#xff0c;主要有以下几种…

常用的函数式接口(Supplier、Consumer、Predicate、Function)

目录 一.函数式接口作为方法的参数 二.函数式接口作为方法的返回值 三.常用的函数式接口 3.1生产型Supplier接口 3.2消费型Consumer接口 抽象方法&#xff1a;accept 默认方法&#xff1a;andThen 3.3判断型Predicate接口 抽象方法&#xff1a;test 默认方法&#xf…

从上燃动力到未势能源,氢能领风者不再蛰伏

“世间本来没有路&#xff0c;人们沿着这条道走多了就变成了路。” 2021年&#xff0c;长城控股集团未势能源科技有限公司总裁陈雪松在一次论坛上&#xff0c;用这句话来形容氢能的发展。冥冥之中&#xff0c;未势能源的命运也像这句话描述的那样&#xff0c;从荒原中走出了一…

报错:org.springframework.jdbc.BadSqlGrammarException:

//报错 2024-02-24 19:44:10.814 ERROR 6184 --- [nio-9090-exec-5] c.e.exception.GlobalExceptionHandler : 异常信息&#xff1a; org.springframework.jdbc.BadSqlGrammarException: GPT&#xff1a; 根据异常信息&#xff0c;这是一个Spring框架抛出的BadSqlGrammar…

[算法沉淀记录] 排序算法 —— 归并排序

排序算法 —— 归并排序 算法介绍 归并排序是一种分治算法&#xff0c;由约翰冯诺伊曼在1945年发明。它的工作原理是将未排序的列表划分为n个子列表&#xff0c;每个子列表包含一个元素(包含一个元素的列表被认为是有序的)&#xff0c;然后重复合并子列表以生成新的有序子列表…

【深入理解设计模式】原型设计模式

原型设计模式 原型设计模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制已有对象来创建新对象&#xff0c;而无需直接依赖它们的具体类。这种模式通常用于需要频繁创建相似对象的场景&#xff0c;以避免昂贵的创建操作或初始化过…

openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响

文章目录 openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响 openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响 LLVM优化效果不仅依赖于数据库内部具体的实现&#xff0c;还与当前所选择的硬件环境等有关。 表达式调用C…

从零开始学逆向:理解ret2syscall

1.题目信息 链接:https://pan.baidu.com/s/19ymHlZZmVGsJHFmmlwww0w 提取码:r4el 首先checksec 看一下保护机制 2.原理 ret2syscall 即控制程序执行系统调用来获取 shell 什么是系统调用? 操作系统提供给用户的编程接口是提供访问操作系统所管理的底层硬件的接口本质上是…

面试经典150题——两数之和

"Success is not the key to happiness. Happiness is the key to success. If you love what you are doing, you will be successful." - Albert Schweitzer 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 暴力求解是比较干脆果断的一种解决问题的方式…

Selenium浏览器自动化测试框架详解

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google C…

构建生物医学知识图谱from zero to hero (4):通过Neo4j构建知识图谱

图数据库是一种专门用于存储图形数据的 NoSQL 数据库。与传统的关系型数据库和其他 NoSQL 数据库不同,图数据库利用图形数据模型来存储和管理数据。图形数据模型由节点和边组成,节点代表实体,边代表实体之间的关系。例如,在社交网络中,用户可以表示为节点,朋友关系可以表…

【Spring】 AOP面向切面编程

文章目录 AOP是什么&#xff1f;一、AOP术语名词介绍二、Spring AOP框架介绍和关系梳理三、Spring AOP基于注解方式实现和细节3.1 Spring AOP底层技术组成3.2 初步实现3.3 获取通知细节信息3.4 切点表达式语法3.5 重用&#xff08;提取&#xff09;切点表达式3.6 环绕通知3.7 切…

时间获取、文件属性获取 2月20日学习笔记

执行两次代码&#xff0c;打印出两次执行过程中新增的文件及删除的文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <dirent.h>#def…

多人协作记账账本小程序开源版开发

多人协作记账账本小程序开源版开发 支持多人协作的记账本小程序&#xff0c;可用于家庭&#xff0c;团队&#xff0c;组织以及个人的日常收支情况记录&#xff0c;支持周月年度统计 便捷记账 便捷的记账方式&#xff0c;支持多种记账类型&#xff0c;快捷切换账本等 多账本 支…

发布订阅模式:观察者模式的一种变体

发布-订阅模型&#xff08;Publish-Subscribe Model&#xff09;的底层机制通常基于观察者模式。 发布-订阅模型是观察者模式的一种变体。 在观察者模式中&#xff0c;主题&#xff08;或被观察者&#xff09;维护了一组观察者&#xff0c;当主题的状态发生变化时&#xff0c…