朋友问我Java中“::”是什么意思?我汗流浃背了......

目录

一:什么是::?

二:方法引用的几种类型

1.引用静态方法

2.引用特定对象的实例方法

3.引用特定类型的任意对象的实例方法

4.引用构造方法

三:方法引用的适用场景 

 四:总结


一:什么是::?

在JDK1.8中引入了Lambda表达式,因此也在JDK1.8引入了::。双冒号 :: 是方法引用(Method Reference)的一种语法。方法引用是一种更简洁和更易读的方式来表示一个函数式接口的实现,它可以看作是lambda表达式的简写。

二:方法引用的几种类型

1.引用静态方法

import java.util.function.Function;/*** @author: dlwlrma* @data 2024年06月30日 20:00* @Description: TODO: 测试静态方法引用*/
public class TestStaticMethod {public static void main(String[] args) {Function<String, Integer> function = Integer::parseInt;Integer apply = function.apply("18");System.out.println("apply = " + apply);//apply = 18}
}

以上代码等同于以下代码:

/*** @author: dlwlrma* @data 2024年06月30日 20:00* @Description: TODO: 测试静态方法引用*/
public class TestStaticMethod {public static void main(String[] args) {Function<String, Integer> parseInt = s -> Integer.parseInt(s);Integer apply1 = parseInt.apply("18");System.out.println("apply1 = " + apply1);}
}

底层源码如下:
 

2.引用特定对象的实例方法

import java.util.function.Supplier;/*** @author: dlwlrma* @data 2024年06月30日 20:25* @Description: TODO: 测试使用实例对象和方法名引用该对象的实例方法。*/
public class TestIntanceMethod {public static void main(String[] args) {String str = "你好";Supplier<Integer> runnable = str::length;Integer i = runnable.get();System.out.println("i = " + i);//i=2;}
}

以上代码等同于以下代码 :

import java.util.function.Supplier;/*** @author: dlwlrma* @data 2024年06月30日 20:25* @Description: TODO: 测试使用实例对象和方法名引用该对象的实例方法。*/
public class TestIntanceMethod {public static void main(String[] args) {String str = "你好";Supplier<Integer> runnable1 = () -> str.length();Integer i = runnable1.get();System.out.println("i = " + i);//        Supplier<Integer> runnable1 = () -> str.length();}
}

3.引用特定类型的任意对象的实例方法

import java.util.function.Function;/*** @author: dlwlrma* @data 2024年06月30日 20:35* @Description: TODO: 使用类名和方法名引用该类的实例方法,适用于任意对象。*/
public class TestIntanceMethod2 {public static void main(String[] args) {Function<String, Integer> str = String::length;Integer length = str.apply("Hello Java");System.out.println(length);//10}
}

以上代码等同于以下代码 

import java.util.function.Function;/*** @author: dlwlrma* @data 2024年06月30日 20:35* @Description: TODO: 使用类名和方法名引用该类的实例方法,适用于任意对象。*/
public class TestIntanceMethod2 {public static void main(String[] args) {Function<String, Integer> str1 = s -> s.length();Integer length = str1.apply("Hello Java");System.out.println(length);//10}
}

4.引用构造方法

import java.util.function.Supplier;/*** @author: dlwlrma* @data 2024年06月30日 20:40* @Description: TODO:使用类名和 new 关键字引用构造方法。*/
public class TestConstructorMethod {public static void main(String[] args) {Supplier<StringBuilder> stringBuilderSupplier = StringBuilder::new;StringBuilder stringBuilder = stringBuilderSupplier.get();System.out.println(stringBuilder); // 输出空的 StringBuilder 对象}
}

以上代码等同于以下代码

import java.util.function.Supplier;/*** @author: dlwlrma* @data 2024年06月30日 20:40* @Description: TODO:使用类名和 new 关键字引用构造方法。*/
public class TestConstructorMethod {public static void main(String[] args) {Supplier<StringBuilder> stringBuilderSupplier1 = () -> new StringBuilder();StringBuilder stringBuilder1 = stringBuilderSupplier.get();System.out.println(stringBuilder); }
}

三:方法引用的适用场景 

方法引用可以用来简化lambda表达式,使代码更简洁易读。它在需要实现函数式接口时特别有用,例如在使用java.util.function包中的接口时。

 

import java.util.Arrays;
import java.util.List;/*** @author: dlwlrma* @data 2024年06月30日 20:44* @Description: TODO: 方法引用的实现场景*/
public class TestDemo {public static void main(String[] args) {List<String> names = Arrays.asList("张三", "李四", "王五");// 使用 lambda 表达式names.forEach(name -> System.out.println(name));// 使用方法引用names.forEach(System.out::println);}
}

在这个示例中,System.out::println是对System.out对象的println方法的引用,它替代了name -> System.out.println(name)的lambda表达式,使代码更加简洁。

 四:总结

在Java中,双冒号(::)可以用作方法引用和构造函数引用的符号。它的好处包括:

1. 简化代码:使用双冒号可以将一些重复的代码进行简化。通过引用已存在的方法或构造函数,可以避免重复编写相同的代码逻辑。

2. 代码可读性更高:通过使用双冒号,可以更清晰地表示代码的意图。它能够更直观地表达方法引用或构造函数引用的含义,使代码更易于理解和维护。

3. 提高代码的可复用性:通过方法引用或构造函数引用,可以将方法或构造函数作为参数传递给其他方法,使代码更加灵活和可复用。

4. 支持函数式编程风格:双冒号操作符在使用Lambda表达式时非常有用。它可以帮助我们将方法引用或构造函数引用与函数式接口一起使用,从而实现函数式编程的目标。

总结来说,双冒号操作符在Java中有助于简化代码、提高可读性、提高代码的可复用性,以及支持函数式编程风格。

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

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

相关文章

【课程总结】Day13(上):使用YOLO进行目标检测

前言 在上一章《【课程总结】Day11&#xff08;下&#xff09;&#xff1a;YOLO的入门使用》的学习中&#xff0c;我们通过YOLO实现了对图片的分类任务。本章的学习内容&#xff0c;将以目标检测为切入口&#xff0c;了解目标检测流程&#xff0c;包括&#xff1a;数据标准、模…

使用NFS网关功能将HDFS挂载到本地系统

HDFS安装教程 HDFS安装教程http://t.csdnimg.cn/2ziFd 使用NFS网关功能将HDFS挂载到本地系统 简介 HDFS提供了基于NFS&#xff08;Network File System&#xff09;的插件&#xff0c;可以对外提供NFS网关&#xff0c;供其它系统挂载使用。 NFS 网关支持 NFSv3&#xff0c;并…

【操作系统】进程管理——进程的概念、组成和特征(个人笔记)

学习日期&#xff1a;2024.6.29 内容摘要&#xff1a;进程的基本概念和特征、状态和转换 进程的概念 程序与进程 程序&#xff1a;是静态的&#xff0c;是存放在磁盘里的可执行文件&#xff0c;就是一系列的指令集合 进程&#xff08;Process&#xff09;&#xff1a;是动态…

GPT-5:下一代AI如何彻底改变我们的未来

GPT-5 发布前瞻&#xff1a;技术突破与未来展望 随着科技的飞速发展&#xff0c;人工智能领域不断迎来新的突破。根据最新消息&#xff0c;OpenAI 的首席技术官米拉穆拉蒂在一次采访中确认&#xff0c;GPT-5 将在一年半后发布&#xff0c;并描述了其从 GPT-4 到 GPT-5 的飞跃如…

Linux随记(十)

一、升级harbor v2.6.4 --> harbor-offline-installer-v2.11.0-rc3 --> v2.9.4 – 随记 漏洞信息&#xff1a; CVE-2023-20902timing condition in Harbor 2.6.x and below, Harbor 2.7.2 and below, Harbor 2.8.2 and below, and Harbor 1.10.17 and below allows an…

js自定义内容生成二维码,qrcodejs的使用

qrcodejs qrcodejs是基于原生js的文本转换成二维码的库&#xff0c;轻量且使用方法简单&#xff0c;它的实现原理是通过canvas将重新编码的内容绘制在页面元素上&#xff0c; 使用qrcodejs时可以选择引入它的cdn或者使用npm下载 <script type"text/javascript" …

软考满分范文“论模型驱动架构设计方法及其应用”,软考高级,系统架构设计师

论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法,以模型构造、模型转换和精化为核心,提供了一套软件设计的指导规范。在模型驱动架构环境下,通过创建出机器可读和高度抽象的模型实现对不同问题域的描述,这些模型独立于实现技术,以标准化的方式储存,利用…

鸿蒙开发Ability Kit(程序框架服务):【向用户申请授权】

向用户申请授权 当应用需要访问用户的隐私信息或使用系统能力时&#xff0c;例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等&#xff0c;应该向用户请求授权&#xff0c;这部分权限是user_grant权限。 当应用申请user_grant权限时&#xff0c;需要完成以下步骤&a…

6.The hardest part about learing hard things(学一件难的事,难在哪里)

I’ve been recording a lot of podcast interviews for my upcoming book, Ultralearning.One of the reurring themes I’ve noticed in our conversations is that how people feel about learning is the overwhelming cause of the results they experience. 我为我的新书…

[leetcode]beautiful-arrangement. 优美的排列

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> match;vector<int> vis;int num;void backtrack(int index, int n) {if (index n 1) {num;return;}for (auto &x : match[index]) {if (!vis[x]) {vis[x] tru…

深入解析高斯过程:数学理论、重要概念和直观可视化全解

与其他算法相比&#xff0c;高斯过程不那么流行&#xff0c;但是如果你只有少量的数据&#xff0c;那么可以首先高斯过程。在这篇文章中&#xff0c;我将详细介绍高斯过程。并可视化和Python实现来解释高斯过程的数学理论。 多元高斯分布 多元高斯分布是理解高斯过程所必须的概…

flink使用StatementSet降低资源浪费

背景 项目中有很多ods层&#xff08;mysql 通过cannal&#xff09;kafka&#xff0c;需要对这些ods kakfa做一些etl操作后写入下一层的kafka&#xff08;dwd层&#xff09;。 一开始采用的是executeSql方式来执行每个ods→dwd层操作&#xff0c;即类似&#xff1a; def main(…

观察者模式在金融业务中的应用及其框架实现

引言 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得多个观察者对象同时监听某一个主题对象。当这个主题对象发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新。…

MISRA C

介绍 MISRA C 是由汽车产业软件可靠性协会&#xff08;Motor Industry Software Reliability Association&#xff09;提出的 C 语言编程标准&#xff0c;可提高嵌入式系统软件的安全性和可靠性。这些指南由汽车制造商、零部件供应商和工程咨询公司合作的汽车工业软件可靠性协…

基于STM32的智能农业环境监控系统

目录 引言环境准备智能农业环境监控系统基础代码实现&#xff1a;实现智能农业环境监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;农业环境管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业环境监控系…

ComfyUI高清放大的四种方式(工作流附件在最后)

方式一&#xff1a;Latent放大工作流 1.工作流截图 方式二&#xff1a;ESRGAN&#xff08;传统模型&#xff09;放大工作流 方式三&#xff1a;算法放大&#xff08;后期处理&#xff09;工作流 方式四&#xff1a;Ultimate SD Upscale工作流 这个方式的优势是对于显存底的用…

istitle()方法——判断首字母是否大写其他字母小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 istitle()方法用于判断字符串中所有的单词首字母是否为大写而其他字母为小写。istitle()方法的语法格式如下&#xff1a; str.istitle() …

2024深圳入户新规出炉!快速了解你的入户“绿色通道”

​朋友们&#xff0c;听说你们都在琢磨深圳户口这事儿&#xff1f;没买房的也想来凑凑热闹&#xff0c;其实&#xff0c;深圳户口不仅仅是为了买房&#xff0c;更多的是为了孩子教育、住房申请、医疗福利等等。各位想在深圳这片热土上大展拳脚的朋友们&#xff0c;现在好消息来…

Spring 动态增强逻辑执行分析

1、假如UserService中存在被增强的public 普通方法&#xff0c;那么spring ioc时就会创建对应的代理对象放置到容器中&#xff1b; 2、那么Controller中注入的userService就是代理对象&#xff1b; Service public class UserService {Transactionalpublic void f2(String us…

python open函数中文乱码怎么解决

首先在D盘下新建一个html文档&#xff0c;接着在里面输入含有中文的Html字符&#xff0c;使用中文格式对读取的字符进行解码&#xff0c;再用utf-8的模式对字符进行编码&#xff0c;然后就能正确输出中文字符。 代码如下&#xff1a; # -*- coding: UTF-8 -*- file1 open(&quo…