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…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
