朋友问我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中有助于简化代码、提高可读性、提高代码的可复用性,以及支持函数式编程风格。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学建模比赛介绍与写作建议

0 小序 本文的写作起因是导师要求我给打算参加相关竞赛的师弟们做一次讲座和汇报。我梳理了一个ppt提纲&#xff0c;并经过整理&#xff0c;因此有了这篇文章。 我打算从数学建模论文写作格式和写作技巧入手&#xff0c;接着介绍数学建模常用的数学模型&#xff0c;最后提出一…

sheng的学习笔记-AI-聚类(Clustering)

ai目录 sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是聚类 在“无监督学习”(unsupervised learning)中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&#xff0c;为进一步的数据分析提供基础。此类学…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

清华大学世界排名:2025QS世界大学排名第20名

近日&#xff0c;国际高等教育研究机构QS Quacquarelli Symonds正式发布了2025QS世界大学排名&#xff0c;其中麻省理工学院连续第13年蝉联榜首&#xff0c;北京大学排名由去年的全球第17上升至全球第14名&#xff0c;清华大学位列2025QS世界大学排名第20名&#xff0c;以下是查…

Linux——/etc/passwd文件含义,grep,cut

/etc/passwd文件含义 作用 - 记录用户账户信息&#xff1a;共分为7段&#xff0c;使用冒号分割 含义 - 文件内容意义&#xff1a;账户名&#xff1a;密码代号x&#xff1a;UID&#xff1a;GID&#xff1a;注释&#xff1a;家目录&#xff1a;SHELL - 第7列/sbin/nologin&#x…

大数据可视化实验(七):Python数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;绘制带颜色的柱状图。.. 1 2&#xff09;绘制堆叠柱状图。.. 3 3&#xff09;绘制数学函数曲线图。.. 4 4&#xff09;使用seaborn绘制组合图形。... 5 5&#xff09;使用Boken绘制多个三角形…

软件框架(Framework)是什么?

可实例化的、部分完成的软件系统或子系统&#xff0c;它为一组系统或子系统定义了统一的体系结构(architecture)&#xff0c;并提供了构造系统的基本构造块(building blocks)&#xff0c;还为实现具体功能定义了扩展点(extending points)。 框架实现了体系结构级别的复用。 其…

深度学习评价指标:Precision, Recall, F1-score, mIOU, 和 mDice

在深度学习和机器学习中&#xff0c;评价模型性能是至关重要的一环。本文将详细讲解一些常见的评价指标&#xff0c;包括精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1-score、平均交并比&#xff08;mIOU&#xff09;和平均Dice系数&am…

[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…

【C++】宏定义

严格来说&#xff0c;这个题目起名为C是不合适的&#xff0c;因为宏定义是C语言的遗留特性。CleanCode并不推荐C中使用宏定义。我当时还在公司做过宏定义为什么应该被取代的报告。但是适当使用宏定义对代码是有好处的。坏处也有一些。 无参宏定义 最常见的一种宏定义&#xf…

Python 面试【中级】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【游戏引擎之路】登神长阶(五)

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-6月30日&#xff1a;攻克《Windows游戏编程大师技巧》。 …

厦门新能安科技Ampace校招实习待遇及Verify测评SHL演绎数字推理历年真题题库

一、厦门新能安科技公司介绍 厦门新能安科技有限公司主要业务包括电池制造和销售&#xff0c;电容器及其配套设备制造与销售&#xff0c;电池零配件生产与销售。此外&#xff0c;公司还提供包括技术服务、技术开发、技术咨询、技术交流、技术转让和技术推广在内的全方位服务。公…

安卓开发app-基础的java项目构建补充知识

安卓开发app-基础的java项目构建补充知识&#xff01;上一次分享了基础的项目构建&#xff0c;但是还遗漏了一些基础的内容。今天补充完整。 首先&#xff0c;是关于项目的一些配置文件的信息。 第一个配置文件&#xff1a;{setting.gradle} 国内阿里云仓库地址信息&#xff1…

深度学习基准模型Mamba

深度学习基准模型Mamba Mamba(英文直译&#xff1a;眼镜蛇)具有选择性状态空间的线性时间序列建模&#xff0c;是一种先进的状态空间模型 (SSM)&#xff0c;专为高效处理复杂的数据密集型序列而设计。 Mamba是一种深度学习基准模型&#xff0c;专为处理长序列数据而设计&…

WAIC2024 | 华院计算邀您共赴2024年世界人工智能大会,见证未来科技革新

在智能时代的浪潮汹涌澎湃之际&#xff0c;算法已成为推动社会进步的核心力量。作为中国认知智能技术的领军企业&#xff0c;华院计算在人工智能的广阔天地中&#xff0c;不断探索、创新&#xff0c;致力于将算法的潜力发挥到极致。在过去的时日里&#xff0c;华院计算不断探索…

界面控件Telerik UI for Winforms 2024 Q2新版亮点 - 发布全新的AI相关组件

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件&#xff0c;所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 本文将介绍界面组件Telerik UI for Winform…

4个文章生成器免费版分享,让文章创作更轻松便捷

在当今这个信息飞速传播的时代&#xff0c;文章创作的重要性愈发凸显。无论是从事内容创作的专业人士&#xff0c;还是偶尔需要撰写文章的普通大众&#xff0c;都希望能更高效地完成文章创作任务。而在实际操作中&#xff0c;我们常常会遇到思路卡顿、没有创作灵感的问题。今天…

AWT的菜单组件

AWT的菜单组件 前言一、菜单组件的介绍常见的菜单相关组件常见菜单相关组件集成体系图菜单相关组件使用小要点 二、AWT菜单组件的代码示例示例一示例二实现思路 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&…