Java [ 基础 ] 方法引用 ✨

news2024/11/17 4:58:58

✨探索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类的静态方法parseInt
        Function<String, Integer> stringToInteger = Integer::parseInt;
        // 调用apply方法将字符串"123"转换为整数
        Integer result = stringToInteger.apply("123");
        // 输出结果:123
        System.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类的实例方法equals
        BiFunction<String, String, Boolean> stringEquals = String::equals;
        // 调用apply方法比较两个字符串是否相等
        Boolean result = stringEquals.apply("test", "test");
        // 输出结果:true
        System.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;
    }

    @Override
    public 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.coloradmin.cn/o/1883022.html

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

相关文章

HCIA4.26-5.10

OSPF ——开放式最短路径优先协议 无类别链路状态IGP动态路由协议 距离矢量协议 运行距离矢量协议的路由器会周期性的泛洪自己的路由表&#xff0c;通过路由之间的交互&#xff0c;每台路由器都从相邻的路由器学习到路由条目&#xff0c;随后加载进自己的路由表中。对于网络…

简单分享下python封装

目录&#xff1a; 一、简介&#xff0c;什么是封装 二、封装的优点与好处 三、封装的示例 四、可封装的场景 一、简介&#xff0c;什么是封装 通俗理解&#xff1a;封装&#xff0c;简而言之&#xff0c;就是把数据&#xff08;变量&#xff09;和操作这些数据的方法&#xff0…

全球AI新闻速递7.1

全球AI新闻速递 1.科大讯飞发布讯飞星火 V4.0。 2.成都人形机器人创新中心&#xff1a;基于视觉扩散架构的人形机器人任务生成式模型 R-DDPRM。 3.安徽省人形机器人产业创新中心获批&#xff0c;将打造国内首创、世界领先研究基地。 4.亳州牵手华为打造华佗中医药大模型。 …

系统安全及应用(命令)

目录 一、账号安全控制 1.1 系统账号清理 1.2 密码安全控制 1.3 历史记录控制 1.4 终端自动注销 二、系统引导和登陆控制 2.1 限制su命令用户 2.2 PAM安全认证 示例一&#xff1a;通过pam 模块来防止暴力破解ssh 2.3 sudo机制提升权限 2.3.1 sudo命令&#xff08;ro…

SRS流媒体服务器安装与推拉流测试

一、首先打开SRS Github https://github.com/ossrs/srs二、在Linux系统下安装SRS 1. git clone https://github.com/ossrs/srs2、克隆完后进入trunk文件夹 cd srs/trunk3.进行环境配置 ./configure 检测当前环境是否满足 4.进行编译 make 5.编译完成后运行 ./objs/srs …

统计学期末名词解释说明

基本名词解释P值、显著性、显著水平、样本量、三大分布等 20基本名词详细解释&#xff1a; √P值&#xff1a; 相关名词&#xff1a;显著性、显著性差异、0.01水平显著、0.05水平显著。 P值&#xff0c;也称显著性值或者Sig.值&#xff0c;用于描述某件事情发生的概率情况&a…

器件频频更换为哪桩

曾想象&#xff0c;在一家大型研发型企业里有如下案例&#xff1a; 硬件工程师设计电路选择了器件库中的某器件&#xff0c;在批量试产产品时&#xff0c;却发现没有库存&#xff0c;即时申请采购&#xff0c;却发现货期相当长&#xff0c;一时难以采购&#xff0c;甚至根本不…

【ElementPlus源码】Scrollbar 滚动条

文章目录 thumbclickThumbHandlerstartDragmouseMoveDocumentHandlermouseUpDocumentHandlerclickTrackHandler其他 barScrollbar导出的方法noresize更新滚动条相关属性 utilsruntime.tsbuildProps 看源码时候做的笔记。若有问题&#xff0c;请指出&#xff01; 路径相关格式请…

什么是协程?协程和线程的区别

文章目录 前置知识应用程序和内核阻塞和非阻塞同步和异步并发和并行IO 发展历史同步编程异步多线程/进程异步消息 回调函数&#xff08;响应式编程&#xff09; 协程协程基本概念go 示例代码协程和线程的区别 个人简介 前置知识 在了解协程前&#xff0c;我们先理解一些相关的…

VBA数据库解决方案第十二讲:如何判断数据库中数据表是否存在

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

平安养老险陕西分公司参加2024上半年省级单位驻富平帮扶团联席会

6月28日&#xff0c;平安养老险陕西分公司工会副主席武媛携驻村工作队赴富平县庄里镇永安村参加2024上半年度省级单位驻富平帮扶团联席会议。 会议由省委金融办副主任、省委金融工委委员李嘉辉及省委金融办选派挂职干部、富平县副县长席玮共同主持。 会上&#xff0c;席玮县长带…

全球AI新闻速递6.28

全球AI新闻速递 1.首款 Transformer 专用 AI 芯片 Sohu 登场。 2.钉钉&#xff1a;宣布对所有AI大模型厂商开放&#xff0c;首批7家接入。 3.华为联合清华大学发布《AI 终端白皮书》。 4.国家卫生健康委&#xff1a;推动AI技术在制定个性化营养、运动干预方案中的应用。 …

地下水电站3D虚拟仿真展示平台

借助先进的VR技术&#xff0c;我们将水电站的每一个角落、每一处细节都以三维全景的形式真实呈现。您可以自由穿梭于水电站的各个区域&#xff0c;无论是发电机组、巍峨的水坝&#xff0c;还是错综复杂的输水管道&#xff0c;都近在咫尺。感受水流的澎湃力量&#xff0c;聆听机…

中文TeX,各种数学符号和表格

\documentclass{article} \usepackage{amsmath,amssymb,amsfonts} \usepackage{CJKutf8} \begin{document}\begin{CJK}{UTF8}{gkai}%正文放在此行下与\end{CJK}之间就行你好, LaTeX!平方根 $\sqrt{x}$立方根 $\sqrt[3]{x}$分数的代码是 $\frac{a}{b}$求和的代码是 $\sum_{i1}^{…

自闭症儿童能不能用药

在星贝育园自闭症儿童康复学校&#xff0c;我们一直秉持着谨慎且保守的态度对待自闭症儿童的用药问题。我们坚定地认为&#xff0c;在大多数情况下&#xff0c;药物并非自闭症儿童康复的首选。 自闭症是一种神经发育障碍&#xff0c;其核心症状包括社交沟通障碍、重复刻…

API-元素尺寸与位置

学习目标&#xff1a; 掌握元素尺寸与位置 学习内容&#xff1a; 元素尺寸与位置仿京东固定导航栏案例实现bilibili点击小滑块移动效果 元素尺寸与位置&#xff1a; 使用场景&#xff1a; 前面案例滚动多少距离&#xff0c;都是我们自己算的&#xff0c;最好是页面滚动到某个…

快钱支付股东全部股权已被质押!

根据近期工商信息&#xff0c;第三方支付机构快钱支付清算信息有限公司&#xff08;简称“快钱支付”&#xff09;实际控股方快钱金融服务&#xff08;上海&#xff09;有限公司&#xff08;简称“快钱金融”&#xff09;&#xff0c;作为出质股权标的企业&#xff0c;被出质给…

MQTT协议详述

MQTT 概述 消息队列遥测传输&#xff08;英语&#xff1a;Message Queuing Telemetry Transport&#xff0c;缩写&#xff1a;MQTT&#xff09;&#xff0c;是基于发布&#xff08;Publish&#xff09;/订阅&#xff08;Subscribe&#xff09;范式的消息协议&#xff0c;位于…

qt QTreeView的简单使用(多级子节点)

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);setWindowTitle("QTreeView的简单使用");model new QStandardItemModel;model->setHorizontalHeaderLabels(QStringList() << "left&q…

解决OneDrive “拒绝访问文件” 问题

问题描述&#xff1a; 在尝试将其他文件拖入oneDrive或是打开OneDrive中的文件时。出现如下报错&#xff1a; 拒绝访问文件 无法访问XXXXXXX中的文件。可能已移动或删除了此文件&#xff0c;或者受制于文件权限而不能访问。 ERR_ACCESS_DENIED 解决办法&#xff1a; 1. 找到O…