当前位置: 首页 > news >正文

从零学Java - Lambda表达式

Lambda 表达式

文章目录

  • Lambda 表达式
    • 什么是 Lambda 表达式?
    • 怎么使用?
      • 1 基本语法:
      • 2 箭头符号:
      • 3 代码演示:
      • 4 注意事项
    • 函数式接口
      • 1 什么是函数式接口
      • 2 常见函数式接口
    • 方法引用(了解)
      • 1 什么是方法引用

什么是 Lambda 表达式?

Lambda表达式:特殊的匿名内部类,语法更简洁。

  • 允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递。

怎么使用?

1 基本语法:

<函数式接口>  <变量名> = (参数1,参数2...) -> {//方法体};

2 箭头符号:

-> (箭头操作符), -> 将表达式分成两部分

  • 左侧:(参数1,参数2…)表示参数列表
  • 右侧:{}内部是方法体

3 代码演示:

public class TestLambda {public static void main(String[] args) {//Lambda表达式:特殊的匿名内部类,语法更简洁。//示例1: Runnable接口//匿名内部类:Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("子线程1 开始执行...");}};//简化: Lambda表达式Runnable runnable2 = ()->{System.out.println("子线程2 开始执行...");};//使用new Thread(runnable1).start();new Thread(runnable2).start();//简写: 方法体只有一行代码时new Thread(()-> System.out.println("子线程3 开始执行..."));//示例2: Comparator比较器//匿名内部类Comparator<Integer> cmp1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}};//简化: Lambda表达式Comparator<Integer> cmp2 = (o1, o2) -> o1 - o2;TreeSet<Integer> treeSet1 = new TreeSet<>(cmp1);TreeSet<Integer> treeSet2 = new TreeSet<>(cmp2);}
}

IDEA 快捷键:

  • 在可以使用 Lambda表达式的位置, 按住 Alt + Enter , 即可将原代码用 Lambda表达式书写

4 注意事项

  • 形参列表的数据类型会自动推断。
  • 如果形参列表为空,只需保留() 。
  • 如果形参只有1个,()可以省略,只需要参数的名称即可。
  • 如果执行语句只有一句,且无返回值,{}可以省略,
    若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有一句。
  • Lambda不会生成一个单独的内部类文件。

函数式接口

1 什么是函数式接口

  • 如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上 。
  • @FunctionalInterface 注解检测接口是否符合函数式接口。

代码示例:

interface:

@FunctionalInterface //函数式接口: 只有一个抽象方法
public interface Usb {void service();
}

Test:

public class TestUsb {public static void main(String[] args) {//匿名内部类Usb usb1 = new Usb() {@Overridepublic void service() {System.out.println("连接成功, 开始工作...");}};//Lambda表达式Usb usb2 = () -> System.out.println("连接成功, 开始工作...");}
}

2 常见函数式接口

函数式接口参数类型返回类型说明
Consumer<T> 消费型接口Tvoidvoid accept(T t);对类型为T的对象应用操作
Supplier<T> 供给型接口TT get(); 返回类型为T的对象
Function<T,R> 函数型接口TRR apply(T t);对类型为T的对象应用操作,并返回类型为R类型的对象。
Predicate<T> 断言型接口Tbooleanboolean test(T t);确定类型为T的对象是否满足条件,并返回boolean类型。

TestConsumer:

public class TestConsumer {public static void main(String[] args) {//匿名内部类happy(new Consumer<Double>() {@Overridepublic void accept(Double money) {System.out.println(("聚餐吃饭, 花费:"+ money));}},1000);//Lambda表达式happy(money-> System.out.println("聚餐吃饭, 花费:"+money),2000);}public static void happy(Consumer<Double> consumer, double money) {consumer.accept(money);}
}

TestSupplier:

public class TestSupplier {public static void main(String[] args) {//匿名内部类//获取5个100以内的随机数int[] nums1 = getNums(new Supplier<Integer>() {@Overridepublic Integer get() {return new Random().nextInt(100);}},5);System.out.println(Arrays.toString(nums1));//Lambda表达式//获取10个1000以内的随机数System.out.println(Arrays.toString(getNums(() -> new Random().nextInt(1000),10)));}public static int[] getNums(Supplier<Integer> supplier, int length) {int[] arr = new int[length];for (int i = 0; i < arr.length; i++) {arr[i] = supplier.get();}return arr;}
}

TestFunction:

public class TestFunction {public static void main(String[] args) {//匿名内部类String s1 = handleString(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}, "hello");System.out.println(s1);//Lambda表达式System.out.println(handleString(s -> s.toLowerCase(),"HELLO"));}public static String handleString(Function<String, String> function, String s) {return function.apply(s);}
}

TestPredicate:

public class TestPredicate {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("张三锋");list.add("张耕耘");list.add("韩羽");list.add("张利");list.add("田美丽");//匿名内部类List<String> list1 = filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张");}}, list);System.out.println(list1);//Lambda 表达式List<String> list2 = filter(s -> s.startsWith("田"), list);System.out.println(list2);}public static List<String> filter(Predicate<String> p, List<String> src) {ArrayList<String> list = new ArrayList<>();for (String s : src) {if (p.test(s)){list.add(s);}}return list;}
}

方法引用(了解)

1 什么是方法引用

  • 方法引用是Lambda表达式的一种简写形式。
    • 如果Lambda表达式方法体中只是调用一个特定的已经存在的方法
    • 这个方法的参数和返回值和接口中的方法的参数和返回值保持一致

代码演示:

形式1 : 对象::实例方法

public class TestMethodRef {public static void main(String[] args) {Consumer<String> consumer1 = s -> System.out.println(s);Consumer<String> consumer2 = System.out::println;consumer1.accept("xxx");consumer2.accept("yyy");}
}res:
xxx
yyy

相关文章:

从零学Java - Lambda表达式

Lambda 表达式 文章目录 Lambda 表达式什么是 Lambda 表达式?怎么使用?1 基本语法:2 箭头符号:3 代码演示:4 注意事项 函数式接口1 什么是函数式接口2 常见函数式接口 方法引用(了解)1 什么是方法引用 什么是 Lambda 表达式? Lambda表达式&#xff1a;特殊的匿名内部类&…...

RV1103与FPGA通过MIPI CSI-2实现视频传输,实现网络推流

RV1103与FPGA通过MIPI CSI-2实现视频传输&#xff0c;实现网络推流。 一&#xff1a;图像格式 支持图像格式如下&#xff1a; [0]: NV16 (Y/CbCr 4:2:2) Size: Stepwise 64x64 - 2304x1296 with step 8/8 [1]: NV61 (Y/CrCb 4:2:2) Size: Stepwise 64x64 - 2304x1296 with …...

力扣62. 不同路径

动态规划 思路&#xff1a; 定义 dp[r][c] 为到达坐标 (r, c) 的路径数&#xff1a; 它只能有同一行左边相邻方格向右到达或者同一列上方相邻方格向下到达&#xff1b;状态转移方程&#xff1a; dp[r][c] dp[r][c - 1] dp[r - 1][c]初始状态 dp[0][0] 1第一行的路径数是 1第…...

使用Element-Plus 加载style

vue-chrome-extension 简介 chrome扩展开发插件基于vue3、ts、Element Plus、Webpack5、axios、less开发 支持content快速调用chrome对象及axios 详看 pages/content/app.vue 开箱即用chrome插件 特性 基础框架&#xff1a;使用 Vue3/Element PlusTypeScript: 应用程序级 J…...

Kafka常见指令及监控程序介绍

kafka在流数据、IO削峰上非常有用&#xff0c;以下对于这款程序&#xff0c;做一些常见指令介绍。 下文使用–bootstrap-server 10.0.0.102:9092,10.0.0.103:9092,10.0.0.104:9092 需自行填写各自对应的集群IP和kafka的端口。 该写法 等同 –bootstrap-server localhost:9092 …...

Docker 仓库管理

Docker 仓库管理 仓库&#xff08;Repository&#xff09;是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub&#xff0c;只是远程的服务商不一样&#xff0c;操作都是一样的。 Docker Hub 目前 Docker 官方维护了一个公共仓库 Docker Hub。 大部分需求…...

LeetCode-410.分割数组的最大值

原题链接&#xff1a;https://leetcode.cn/problems/split-array-largest-sum/description 题面 给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连续子数组。设计一个算法使得这 k 个子数组各自和的最大值最小。 思路 数组定义&#xff…...

Redis和RediSearch的安装及使用

1. 安装要求 ReadiSearch要求Redis的版本在6.0以上RediSearch 要求使用 GNU Make 4.0 或更高版本 2. Redis的安装 查看redis的版本&#xff1a; redis-server --version或者&#xff0c;如果你已经启动了Redis服务器&#xff0c;你也可以使用redis-cli工具来获取版本信息&a…...

面向对象进阶--接口2

JDK8开始接口中新增的方法 接口中可以定义有方法体的方法&#xff08;默认、静态&#xff09;。 使用默认方法的作用&#xff1a;解决接口升级的问题。 接口中默认方法的定义格式&#xff1a; public default返回值类型 方法名&#xff08;参数列表&#xff09;{} 接口中默…...

提升认知,推荐15个面向开发者的中文播客

前言 对于科技从业者而言&#xff0c;无论是自学成才的程序员&#xff0c;还是行业资深人士&#xff0c;终身学习是很有必要的&#xff0c;尤其是在这样一个技术快速迭代更新的时代。 作为一个摆脱了时间和空间限制的资讯分享平台&#xff0c;播客&#xff08;Podcast&#x…...

数据分析-Pandas如何整合多张数据表

数据分析-Pandas如何整合多张数据表 数据表&#xff0c;时间序列数据在数据分析建模中很常见&#xff0c;例如天气预报&#xff0c;空气状态监测&#xff0c;股票交易等金融场景。数据分析过程中表格重整&#xff0c;重新调整&#xff0c;重塑数据表是很重要的技巧&#xff0c…...

配置redis挂载

1. 暂停和删除redis 2.创建文件夹 /usr/local/software/redis/6379/conf/ /usr/local/software/redis/6379/data/ 把redis-conf文件上传到conf文件夹中 3.配置网络 docker network create --driver bridge --subnet172.18.12.0/16 --gateway172.18.1.1 wn_docker_net 4.运…...

C++ 实现游戏(例如MC)键位显示

效果&#xff1a; 是不是有那味儿了&#xff1f; 显示AWSD&#xff0c;空格&#xff0c;Shift和左右键的按键情况以及左右键的CPS。 彩虹色轮廓&#xff0c;黑白填充。具有任务栏图标&#xff0c;可以随时关闭字体是Minecraft AE Pixel&#xff0c;如果你没有装&#xff08;大…...

力扣hot100 合并两个有序链表 递归 双指针

Problem: 21. 合并两个有序链表 文章目录 &#x1f496; 递归思路 &#x1f496; 双指针 &#x1f496; 递归 思路 &#x1f468;‍&#x1f3eb; 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂…...

10个常用python自动化脚本

大家好&#xff0c;Python凭借其简单和通用性&#xff0c;能够为解决每天重复同样的工作提供最佳方案。本文将探索10个Python脚本&#xff0c;这些脚本可以帮助自动化完成任务&#xff0c;提高工作效率。无论是开发者、数据分析师还是仅仅想简化工作流程的普通用户&#xff0c;…...

C++中函数的默认参数(缺省参数)

一、函数默认参数的概念 在函数声明时&#xff0c;预先对函数参数进行赋值&#xff0c;该参数即为函数的默认参数&#xff0c;也叫缺省参数。 如下函数func1包含默认参数&#xff0c;若调用函数func1时没有给函数传入实参&#xff0c;则默认实参为10086 void func1(int a 1…...

在线扒站网PHP源码-在线扒站工具网站源码

源码介绍 这是一款在线的网站模板下载程序&#xff0c;也就是我们常说的扒站工具&#xff0c;利用它我们可以很轻松的将别人的网站模板样式下载下来&#xff0c;这样就可以大大提高我们编写前端的速度了&#xff01;注&#xff1a;扒取的任何站点不得用于商业、违法用途&#…...

vue+elementUI el-select 中 没有加clearable出现一个或者多个×清除图标问题

1、现象&#xff1a;下方截图多清除图标了 2、在全局common.scss文件中加一个下方的全局样式noClear 3、在多清除图标的组件上层div加noClear样式 4、清除图标去除成功...

【Python从入门到进阶】47、Scrapy Shell的了解与应用

接上篇《46、58同城Scrapy项目案例介绍》 上一篇我们学习了58同城的Scrapy项目案例&#xff0c;并结合实际再次了项目结构以及代码逻辑的用法。本篇我们来学习Scrapy的一个终端命令行工具Scrapy Shell&#xff0c;并了解它是如何帮助我们更好的调试爬虫程序的。 一、Scrapy Sh…...

【ARM 嵌入式 编译系列 2.2 -- GCC 编译参数学习 assembler-with-cpp 使用介绍】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 GCC 编译选项 assembler-with-cpp GCC 编译选项 assembler-with-cpp 在 rt-thread 的编译脚本中经常会看到下面编译参数&#xff1a; AFLAGS -c DEVICE -x assembler-with-cpp -Wa,-mimplicit-itthumb a…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...