java 方法引用与构造器引用
Java 方法引用和构造器引用是 Java 8 引入的重要特性,它们进一步简化了 Lambda 表达式的书写,使得代码更加简洁和易读。下面详细介绍方法引用和构造器引用的概念、用法及示例。
方法引用
方法引用是一种简化 Lambda 表达式的语法糖,它允许通过类名或对象引用直接引用已有方法。方法引用可以替代某些 Lambda 表达式,使得代码更简洁。
语法
方法引用的语法格式如下:
- 引用类的方法:
ClassName::methodName
- 引用对象的方法:
objectReference::methodName
- 引用实例方法:
instanceReference::methodName
- 引用构造器:
ClassName::new
示例
示例 1:引用类的方法
假设有一个 MathUtil
类,其中包含一个静态方法 square
:
public class MathUtil {public static int square(int x) {return x * x;}
}
使用 Lambda 表达式和方法引用:
import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 Lambda 表达式numbers.stream().map(x -> MathUtil.square(x)).forEach(System.out::println);// 使用方法引用numbers.stream().map(MathUtil::square).forEach(System.out::println);}
}
示例 2:引用对象的方法
假设有一个 Calculator
类,其中包含一个实例方法 add
:
public class Calculator {public int add(int a, int b) {return a + b;}
}
使用 Lambda 表达式和方法引用:
import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {Calculator calculator = new Calculator();List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 Lambda 表达式numbers.stream().map(x -> calculator.add(x, 10)).forEach(System.out::println);// 使用方法引用numbers.stream().map(x -> calculator::add).forEach(System.out::println);}
}
示例 3:引用实例方法
假设有一个 StringUtil
类,其中包含一个实例方法 reverse
:
public class StringUtil {public String reverse(String str) {return new StringBuilder(str).reverse().toString();}
}
使用 Lambda 表达式和方法引用:
import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {List<String> strings = Arrays.asList("hello", "world", "java");// 使用 Lambda 表达式strings.stream().map(str -> new StringUtil().reverse(str)).forEach(System.out::println);// 使用方法引用strings.stream().map(StringUtil::reverse).forEach(System.out::println);}
}
构造器引用
构造器引用是另一种方法引用的形式,用于创建对象的构造器。构造器引用的语法格式如下:
- 引用构造器:
ClassName::new
示例
示例 1:引用构造器
假设有一个 Person
类,其中包含一个构造器:
public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}
使用 Lambda 表达式和构造器引用:
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;public class ConstructorReferenceExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie");List<Integer> ages = Arrays.asList(25, 30, 35);// 使用 Lambda 表达式List<Person> people = new ArrayList<>();for (int i = 0; i < names.size(); i++) {people.add(new Person(names.get(i), ages.get(i)));}// 使用构造器引用List<Person> people2 = IntStream.range(0, names.size()).mapToObj(i -> new Person(names.get(i), ages.get(i))).collect(Collectors.toList());// 使用 SupplierSupplier<Person> supplier = Person::new;Person person = supplier.get();}
}
方法引用的常见应用场景
1. 遍历集合
import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用方法引用numbers.forEach(System.out::println);}
}
2. 字符串处理
import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {List<String> strings = Arrays.asList("hello", "world", "java");// 使用方法引用strings.stream().map(String::toUpperCase).forEach(System.out::println);}
}
3. 数学运算
import java.util.Arrays;
import java.util.List;public class MethodReferenceExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用方法引用int sum = numbers.stream().reduce(0, Integer::sum);System.out.println(sum); // 输出 15}
}
总结
Java 方法引用和构造器引用是 Java 8 引入的重要特性,它们进一步简化了 Lambda 表达式的书写,使得代码更加简洁和易读。
-
方法引用:用于引用已有方法,可以替代某些 Lambda 表达式,使得代码更简洁。
- 引用类的方法:
ClassName::methodName
- 引用对象的方法:
objectReference::methodName
- 引用实例方法:
instanceReference::methodName
- 引用类的方法:
-
构造器引用:用于引用构造器,简化对象创建。
- 引用构造器:
ClassName::new
- 引用构造器:
通过使用方法引用和构造器引用,可以显著减少代码量,提高代码的可读性和可维护性。掌握这些特性后,可以更好地利用它们来编写高效、简洁的 Java 应用程序。
相关文章:
java 方法引用与构造器引用
Java 方法引用和构造器引用是 Java 8 引入的重要特性,它们进一步简化了 Lambda 表达式的书写,使得代码更加简洁和易读。下面详细介绍方法引用和构造器引用的概念、用法及示例。 方法引用 方法引用是一种简化 Lambda 表达式的语法糖,它允许通…...
python3的语法
知识简介 基础语法就像比赛规则,比如比赛跑步,咱们不能跑到别人的跑道去吧,比赛打拳,先说好不能踢裆。 正文 一、python3的基础语法 1、编码 python的源码文件.py一般是utf8编码的,有时候咱们在执行源码文件的时候报…...
Spring Data JPA中的锁机制
当多个事务同时修改同一条记录时,可能会导致数据不一致的问题。为了确保并发事务中的数据一致性,可以使用锁机制。常见的两种锁机制是悲观锁和乐观锁。下面是这两种锁机制的详细讲解。 1. 悲观锁(Pessimistic Locking) 概念&…...
mybatis分页拦截器
Mapper 方法: public interface UserMapper {void selectUsers(@Param("page") Page<User> page...

React学习过程(持续更新......)
React学习过程(持续更新…) 创建react的hello项目 使用node创建create-react-app脚手架项目 //首先你得先安装node,这里不做详细教程,我使用的node为20.18.0 npm isntall create-react-app -g //全局安装create-react-app crea…...
pve lxc容器探索,陆续完善中
注意:创建lxc容器时,不要勾选“无特权容器”,才可以使用如下命令进行挂载。 说明:容器附加主机目录,/myweb/src为主机目录,/src为lxc中目录,100为容器ID pct set 100 -mp1 /myweb/src,mp/src执…...

5款人声分离免费软件分享,从入门到精通,伴奏提取分分钟拿捏!
人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来,使得用户可以单独处理或重混音频,创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具,这一过程往往会比较困难。…...

镭速助力解决企业大文件传输难题
在数字化时代,数据已成为企业的核心资产。无论是高清视频、大规模数据库备份还是复杂的3D设计文件,企业每天都要处理大量数据。然而,在享受数据带来的便利和价值的同时,企业也面临着一个现实问题——如何高效、安全地传输大文件&a…...

SpringBootWeb AOP
SpringBootWeb AOP 事务管理 rollbackFor属性 propagation属性 案例 AOP 基础 进阶 通知类型 通知顺序 切入点表达式 execution annotation 连接点 案例 实体类 接口方法 切面类 事务管理 rollbackFor属性 propagation属性 REQUIRED:大部分情况下都是用该传播行为…...

傅里叶分析之掐死教程(完整版)更新于2014.06.06
作 者:韩 昊 知 乎:Heinrich 微 博:花生油工人 知乎专栏:与时间无关的故事 谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。 转载的同学请保留上面这句话,谢谢。如果…...

macOS终端配置自动补全功能
如何在macOS终端中配置自动补全功能 终端是一个非常强大的工具,它可以用来完成很多任务,比如创建、复制、移动、删除文件,执行脚本和运行程序。不过它的默认设置对用户不太友好,作为开发者,我们通常习惯代码编辑器的辅…...

华为---MUX VLAN简介及示例配置
目录 1. 产生背景 2. 应用场景 3. 主要功能 4. 基本概念 5. 配置步骤及相关命令 6.示例配置 6.1 示例场景 6.2 网络拓扑图 6.3 配置代码 6.4 配置及解析 6.5 测试验证 配置注意事项 1. 产生背景 MUX VLAN(Multiplex VLAN)提供了一种通过VLA…...
docker详解介绍+基础操作 (四)容器镜像
一.镜像结构和原理 Docker 镜像是 Docker 技术的核心组成部分之一,它用于封装应用程序及其依赖项,以便在任何支持 Docker 的环境中运行。了解 Docker 镜像的结构和原理对于有效使用 Docker 至关重要。以下是对 Docker 镜像结构和原理的详细介绍。 Dock…...

PostgreSQL数据库定期清理归档(pg_wal)日志
一、配置归档模式 在postgresql.conf文件中设置archive_mode on来启用归档功能。 二、设置归档命令 同样在postgresql.conf中,设置archive_command参数,指定一个shell命令来处理归档日志,例如: archive_command cp %p /home/…...
RTTI介绍
RTTI介绍 RTTI(Run-Time Type Information,运行时类型信息)是C的一项功能,它允许在程序运行时检查对象的类型。RTTI的主要作用是在多态(polymorphism)场景中,可以在运行时安全地转换对象类型或…...
【C#生态园】C#推送通知库大比拼:选择最适合你项目的库
提升用户体验:C#推送通知库详细评测及比较 前言 在移动应用开发中,推送通知是一个至关重要的功能。它可以帮助应用保持与用户的互动,及时传递重要信息,提升用户体验。本文将介绍几个用于C#的推送通知库,帮助开发者了…...

乐歌E5,E6系列升降桌质量如何?2024推荐必买的四款热销型号
在数字化时代,电脑桌成为了我们日常生活和工作中不可或缺的一部分。然而,长时间坐在固定高度的电脑桌前,不仅会影响我们的工作效率,还可能对身体健康造成不良影响。因此,一款能够电动升降的电脑桌显得尤为重要。 乐歌…...
Android广播
文章目录 1.收发应用广播1.标准广播2.有序广播3.广播的静态注册 2.监听系统广播1.接受分钟到达广播2.接受网络变更广播3.定时管理器AlarmManager 3.捕捉屏幕的变更事件1.竖屏和横屏切换2.回到桌面与切换到任务列表 1.收发应用广播 1.标准广播 广播的收发过程分为三个步骤&…...
Chapter 2 - 3. Understanding Congestion in Fibre Channel Fabrics
B2B Credit Counters Figure 2-3 shows the following counters on an FC port: 图 2-3 显示了 FC 端口上的以下计数器: 1. Rx B2B credits: The number of receive buffers of an FC port. This value does not change while the port is up. FC 端口的接收缓冲区数量。该值…...
014 属性分组
文章目录 后端AttrGroupEntity.javaCategoryEntity.javaAttrGroupController.javaCategoryServiceImpl.java 前端attrgroup-add-or-update.vue https://element.eleme.cn/#/zh-CN/component/cascader 后端 AttrGroupEntity.java package com.xd.cubemall.product.entity;impo…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...