Java [ 基础 ] 方法引用 ✨

✨探索Java基础✨

Java基础:方法引用

方法引用是Java 8中引入的一种新特性,它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的应用。

什么是方法引用?

方法引用是一种可以直接引用或调用现有方法的简洁语法。它的语法格式是ClassName::methodName。方法引用的主要目的是为了减少Lambda表达式的冗余代码,使代码更加清晰和简洁。通过方法引用,我们可以避免一些重复代码,使代码更加模块化和易于维护。

方法引用的四种类型
  1. 引用静态方法
  2. 引用实例方法
  3. 引用对象的方法
  4. 引用构造器

我们将通过详细示例介绍每一种方法引用的使用。

1. 引用静态方法

静态方法引用使用语法:ClassName::methodName。例如:

import java.util.function.Function;public class StaticMethodReference {public static void main(String[] args) {// 使用方法引用引用Integer类的静态方法parseIntFunction<String, Integer> stringToInteger = Integer::parseInt;// 调用apply方法将字符串"123"转换为整数Integer result = stringToInteger.apply("123");// 输出结果:123System.out.println(result); }
}

在这个示例中,Integer::parseInt是对Integer类的静态方法parseInt的引用。这种引用方式非常适用于将现有的静态方法转换为函数式接口实例。

2. 引用实例方法

实例方法引用使用语法:instance::methodName。例如:

import java.util.function.Consumer;public class InstanceMethodReference {public static void main(String[] args) {// 定义一个字符串String str = "Hello, World!";// 使用方法引用引用System.out对象的println方法Consumer<String> printer = System.out::println;// 调用accept方法输出字符串printer.accept(str); // 输出:Hello, World!}
}

在这个示例中,System.out::println是对System.out对象的实例方法println的引用。这种方式非常适用于现有对象的实例方法。

3. 引用特定对象的方法

特定对象的方法引用使用语法:ClassName::methodName。例如:

import java.util.function.BiFunction;public class ObjectMethodReference {public static void main(String[] args) {// 使用方法引用引用String类的实例方法equalsBiFunction<String, String, Boolean> stringEquals = String::equals;// 调用apply方法比较两个字符串是否相等Boolean result = stringEquals.apply("test", "test");// 输出结果:trueSystem.out.println(result); }
}

在这个示例中,String::equals是对String类实例方法equals的引用。这种方式适用于将类的实例方法转换为函数式接口。

4. 引用构造器

构造器引用使用语法:ClassName::new。例如:

import java.util.function.Function;class Person {private String name;// 定义一个构造器public Person(String name) {this.name = name;}@Overridepublic String toString() {return "Person{name='" + name + "'}";}
}public class ConstructorReference {public static void main(String[] args) {// 使用方法引用引用Person类的构造器Function<String, Person> personCreator = Person::new;// 调用apply方法创建一个Person对象Person person = personCreator.apply("John");// 输出结果:Person{name='John'}System.out.println(person); }
}

在这个示例中,Person::new是对Person类构造器的引用。这种引用方式非常适用于工厂方法模式,可以创建对象的实例。

方法引用与Lambda表达式的对比

方法引用是Lambda表达式的一种简化形式,但两者有很多相似之处。方法引用的语法更加简洁,可以直接引用现有的方法,而Lambda表达式需要定义一个匿名函数。例如:

使用Lambda表达式:

// 使用Lambda表达式将字符串转换为整数
Function<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);

使用方法引用:

// 使用方法引用将字符串转换为整数
Function<String, Integer> stringToInteger = Integer::parseInt;

可以看出,方法引用使代码更加简洁,不需要再编写Lambda表达式中的参数和方法调用。

方法引用的优势
  1. 简洁性:方法引用可以使代码更简洁,减少不必要的Lambda表达式。
  2. 可读性:方法引用使代码更易读,开发者可以更容易理解代码的意图。
  3. 重用性:通过方法引用,可以直接重用已有的方法,而不需要再编写一遍逻辑。
实际应用中的方法引用

在实际开发中,方法引用可以用于各种场景,例如:

  • 集合操作:使用方法引用可以简化集合操作中的代码。例如,排序操作可以使用方法引用简化代码。

    import java.util.Arrays;
    import java.util.List;public class CollectionExample {public static void main(String[] args) {// 创建一个字符串列表List<String> names = Arrays.asList("John", "Jane", "Tom", "Alice");// 使用方法引用对列表进行排序names.sort(String::compareToIgnoreCase);// 输出结果:[Alice, Jane, John, Tom]System.out.println(names); }
    }
    

  • 流操作:在流操作中,方法引用可以使代码更加简洁。

     
    import java.util.Arrays;
    import java.util.List;public class StreamExample {public static void main(String[] args) {// 创建一个字符串列表List<String> names = Arrays.asList("John", "Jane", "Tom", "Alice");// 使用方法引用将列表中的字符串转换为大写并输出names.stream().map(String::toUpperCase).forEach(System.out::println); // 输出:JOHN, JANE, TOM, ALICE}
    }
    

  • 线程操作:使用方法引用可以简化线程操作中的代码。

     
    public class ThreadExample {public static void main(String[] args) {// 使用方法引用创建并启动一个新线程new Thread(System.out::println).start();}
    }
    

总结

方法引用是Java 8引入的一个强大特性,使得代码更加简洁和易读。通过四种类型的方法引用,我们可以引用静态方法、实例方法、对象的方法以及构造器。

在实际开发中,合理使用方法引用可以提高代码的可维护性和重用性。希望通过本文的介绍,你能更好地理解和应用Java中的方法引用特性,为你的开发工作带来便利。

觉得有用的话可以点点赞 (*/ω\*),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

【深入浅出 】——【Python 字典】——【详解】

目录 1. 什么是 Python 字典&#xff1f; 1.1 字典的基本概念 1.2 字典的用途 1.3 字典的优势 2. 字典的基本特点 2.1 键的唯一性 2.2 可变性 2.3 无序性 3. 如何创建字典&#xff1f; 3.1 使用 {} 符号 3.2 使用 dict() 工厂方法 3.3 使用 fromkeys() 方法 4. 字…

[工业网络][2] 安全背景知识

安全背景知识 物理、网络和人员安全 在考虑企业和工业的安全性时&#xff0c;安全从业人员传统上将自己划分为三个专业领域。我们借助于安全中经常使用的两个术语来描述这三个领域 业内人士。属于您的设施的人员&#xff0c;包括员工和受邀承包商&#xff0c;访客或交付和服…

K8s的基本使用和认识

目录 介绍 控制端 Node(节点) 控制端与节点的关系图 基本使用 创建和运行资源 查找和参看资源 修改和删除资源 介绍 控制端 api-server(api)是集群的核心是k8s中最重要的组件,因为它是实现声明式api的关键 kubernetes api-server的核心功能是提供了Kubernetes各类资…

应用监控SkyWalking调研

参考&#xff1a; 链路追踪( Skyworking )_skywalking-CSDN博客 企业级监控项目Skywalking详细介绍&#xff0c;来看看呀-CSDN博客 SkyWalking 极简入门 | Apache SkyWalking 使用 SkyWalking 监控 ClickHouse Server | Apache SkyWalking https://zhuanlan.zhihu.com/p/3…

Linux应急响应靶机 2

一、靶机介绍 应急响应靶机-Linux2 前景需要&#xff1a;看监控的时候发现webshell告警&#xff0c;领导让你上机检查你可以救救安服仔吗&#xff01;&#xff01; 1,提交攻击者IP 2,提交攻击者修改的管理员密码(明文) 3,提交第一次Webshell的连接URL(http://xxx.xxx.xxx.…

【每日刷题】Day78

【每日刷题】Day78 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1608. 特殊数组的特征值 - 力扣&#xff08;LeetCode&#xff09; 2. 1385. 两个数组间的距离值 - …

R可视化:好看的气泡图

加载R包 library(tidyverse) library(camcorder)gg_record(dir "tidytuesday-temp", device "png", width 8, height 8, units "in", dpi 320)导入数据 team_results <- readr::read_csv(https://raw.githubusercontent.com/rfordata…

设置Docker中时区不生效的问题

项目中使用docker-compose&#xff0c;并通过以下方式设置了时区 environment:- SET_CONTAINER_TIMEZONEtrue- CONTAINER_TIMEZONEAsia/Shanghai 但是并没有正确生效&#xff0c;网上有很多博客都在推荐这个做法&#xff0c;另外一种是使用标准环境标量 -TZAsia/Shangehai …

24 年程序员各岗位薪资待遇汇总(最新)

大家好&#xff0c;我是程序员鱼皮。今天分享 24 年 6 月最新的程序员各岗位薪资待遇汇总。 数据是从哪儿来的呢&#xff1f;其实很简单&#xff0c;BOSS 直聘上有一个免费的薪酬查询工具&#xff0c;只要认证成为招聘者就能直接看&#xff0c;便于招聘者了解市场&#xff0c;…

RabbitMQ消息可靠性等机制详解(精细版三)

目录 七 RabbitMQ的其他操作 7.1 消息的可靠性(发送可靠) 7.1.1 confim机制(保证发送可靠) 7.1.2 Return机制(保证发送可靠) 7.1.3 编写配置文件 7.1.4 开启Confirm和Return 7.2 手动Ack(保证接收可靠) 7.2.1 添加配置文件 7.2.2 手动ack 7.3 避免消息重复消费 7.3.…

【C语言】23.文件操作

由于要对数据进行持久化保存&#xff0c;我们就有了文件。 一、程序文件与数据文件 磁盘&#xff08;硬盘&#xff09;上的文件是文件。 但是在程序设计中&#xff0c;我们⼀般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09…

“论云上自动化运维及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 云上自动化运维是传统IT运维和DevOps的延伸&#xff0c;通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本&#xff0c;提升系统的灵活度&#xff0c;以及系统的交付速度&#xff0c;增强系统的可靠性&#xff0c;构建更加安全、可信、…

2024年最适合Python小白的零基础入门教程!

伴随着云计算、大数据、AI等技术的迅速崛起&#xff0c;市场对Python人才的需求和市场人才的匮乏&#xff0c;让长期沉默的Python语言一下子备受众人的关注&#xff0c;再加上简单易学&#xff0c;使得Python一跃成为TIOBE排行榜的第一。 准备学Python或者想学Python的小伙伴们…

13 Redis-- 数据一致性模型、MySQL 和 Redis 的数据一致性

数据一致性模型 根据一致性的强弱分类&#xff0c;可以将一致性模型按以下顺序排列&#xff1a; 强一致性 > 最终一致性 > 弱一致性 数据一致性模型一般用于分布式系统中&#xff0c;目的是定义多个节点间的同步规范。 在这里&#xff0c;我们将其引入数据库和缓存组…

【正点原子K210连载】第十四章 按键输入实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十四章 按键输入实…

Vue3 登录成功,浏览器存在toke,再次访问/login路由到/index 首页页面

文章目录 目录 文章目录 流程 小结 概要流程技术细节小结 概要 首先需要清楚知道浏览器localstorage和Session storage的区别 localStorage 和 sessionStorage 是 HTML5 提供的两种客户端存储数据的方法&#xff0c;它们在使用和生命周期上有一些区别&#xff1a; 1. 生命周期…

@Cacheable解决复杂对象形参导致的缓存失效问题(如Map参数)

在Spring中使用 Cacheable 注解可以非常方便地实现方法的自动缓存机制。如以下代码&#xff1a; Cacheable(value "YwtbToken", key "#p0") public String createToken(String dlzh) {...}但当Cacheable 注解修饰的方法参数使用了复杂对象&#xff0c;如…

物联网数据可视化利器:云组态设计器全新升级

数据可视化已成为数据展示与分析领域非常重要的工具。由多种图表、3D图形组成的大屏能够帮助用户非常直观简洁地了解数据。在物联网环境下,用户在制作数据展示大屏时,对数据可视化工具提出了更高的要求,例如能够展示3D组件、灵活的图层结构、支持多种数据源、实时的数据更新、图…

函数创建单链表---无n型,需要 while 循环 + scanf

题目&#xff1a; #include <stdlib.h> struct link{int data;struct link *next; }; struct link* creatLink(); int main(){struct link *head,*p;headcreatLink();for(phead->next ;p;pp->next )printf("%d ",p->data );return 0; }/* 请在这里填…

软考《信息系统运行管理员》-2.1信息系统运维的管理

2.1信息系统运维的管理 信息系统运维管理体系框架 信息系统运维管理主要流程的目标 标准化&#xff1a;通过流程框架&#xff0c;构件标准的运维流程流程化&#xff1a;将大部分运维工作流程化&#xff0c;确保工作可重复&#xff0c;并且这些工作都有质量的完成&#xff0c;…