Java中的方法引用、构造器引用和数组引用

Java中的方法引用、构造器引用和数组引用

在Java 8中,除了引入Lambda表达式外,还引入了方法引用、构造器引用和数组引用。这些引用为我们提供了一种更简洁的语法来引用现有的方法、构造器和数组,从而使代码更加简洁和可读。

一、方法引用

1.1 什么是方法引用?

方法引用是一种更简洁的Lambda表达式写法,它可以直接引用已有的方法,避免了Lambda表达式中显式定义方法体的繁琐。方法引用使用 :: 操作符。

1.2 方法引用的四种形式

1.2.1 静态方法引用

格式:类名::静态方法名

示例:

// Lambda表达式写法
Function<Integer, String> func = num -> String.valueOf(num);

// 方法引用写法
Function<Integer, String> func = String::valueOf;

System.out.println(func.apply(123)); // 输出:123
1.2.2 实例方法引用

格式:实例对象::实例方法名

示例:

// Lambda表达式写法
Consumer<String> consumer = str -> System.out.println(str);

// 方法引用写法
Consumer<String> consumer = System.out::println;

consumer.accept("Hello, Method Reference!"); // 输出:Hello, Method Reference!
1.2.3 对象方法引用

格式:类名::实例方法名

示例:

// Lambda表达式写法
BiPredicate<String, String> predicate = (str1, str2) -> str1.equals(str2);

// 方法引用写法
BiPredicate<String, String> predicate = String::equals;

System.out.println(predicate.test("test", "test")); // 输出:true

二、构造器引用

构造器引用是方法引用的一种特殊形式,它用于引用类的构造方法。

2.1 无参构造器引用

示例:

// Lambda表达式写法
Supplier<Person> supplier = () -> new Person();

// 构造器引用写法
Supplier<Person> supplier = Person::new;

Person person = supplier.get();

2.2 带参构造器引用

示例:

// Lambda表达式写法
Function<String, Person> function = name -> new Person(name);
BiFunction<String, Integer, Person> function2 = (name, age) -> new Person(name, age);

// 构造器引用写法
Function<String, Person> function = Person::new;
BiFunction<String, Integer, Person> function2 = Person::new;

Person person1 = function.apply("John");
Person person2 = function2.apply("John", 12);

三、数组引用

数组引用是一种特殊形式的构造器引用,用于创建数组对象。

3.1 数组引用的使用

示例:

// Lambda表达式写法
Function<Integer, String[]> function = size -> new String[size];

// 数组引用写法
Function<Integer, String[]> function = String[]::new;

String[] array = function.apply(10);
System.out.println(array.length); // 输出:10

四、综合示例

为了更好地理解方法引用、构造器引用和数组引用,我们来看一个综合示例:

import java.util.function.*;

public class ReferenceExample {
    public static void main(String[] args) {
        // 静态方法引用
        Function<Integer, String> staticMethodRef = String::valueOf;
        System.out.println(staticMethodRef.apply(123)); // 输出:123

        // 实例方法引用
        Consumer<String> instanceMethodRef = System.out::println;
        instanceMethodRef.accept("Hello, Method Reference!"); // 输出:Hello, Method Reference!

        // 对象方法引用
        BiPredicate<String, String> objectMethodRef = String::equals;
        System.out.println(objectMethodRef.test("test", "test")); // 输出:true

        // 无参构造器引用
        Supplier<Person> noArgConstructorRef = Person::new;
        Person person1 = noArgConstructorRef.get();

        // 带参构造器引用
        Function<String, Person> argConstructorRef = Person::new;
        BiFunction<String, Integer, Person> argConstructorRef2 = Person::new;
        Person person2 = argConstructorRef.apply("John");
        Person person3 = argConstructorRef2.apply("John", 12);

        // 数组引用
        Function<Integer, String[]> arrayRef = String[]::new;
        String[] array = arrayRef.apply(10);
        System.out.println(array.length); // 输出:10
    }
}

class Person {
    private String name;
    private int age;

    public Person() {
        this.name = "Unknown";
    }

    public Person(String name) {
        this.name = name;
    }
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

结论

方法引用、构造器引用和数组引用为Java开发者提供了更简洁、直观的代码编写方式。这些引用不仅减少了代码冗余,还提升了代码的可读性。在实际开发中,合理使用这些特性可以大大提升开发效率,使代码更加清晰易懂。希望通过本文的讲解,你能更好地理解并应用这些特性。

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

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

相关文章

Opencv+python模板匹配

我们经常玩匹配图像或者找相似&#xff0c;opencv可以很好实现这个简单的小功能。 模板是被查找目标的图像&#xff0c;查找模板在原始图像中的哪个位置的过程就叫模板匹配。OpenCV提供的matchTemplate()方法就是模板匹配方法&#xff0c;其语法如下&#xff1a; result cv2.…

【活动感想】筑梦之旅·AI共创工坊 workshop 会议回顾

目录 &#x1f30a;1. 会议详情 &#x1f30a;2. 会议回顾 &#x1f30d;2.1 主持人开场 &#x1f30d;2.2 元甲-小当家 AI 驱动的创意儿童营养早餐料理机&今天吃什么App &#x1f30d;2.3 Steven- A l 心理疗愈认知 &#x1f30d;2.4 伯棠-诸子百家(xExperts)-多智能…

私有部署Twikoo评论系统

原文&#xff1a;https://blog.c12th.cn/archives/12.html 前言 以前用 MongoDB Vercel 搭建 Twikoo 老是有点小问题&#xff0c;所以就放弃了。无意中看到可以用 docker 来搭建&#xff0c;正好有台服务器可以尝试下。 私有部署 Twikoo 版本要求 1.6.0 或以上 &#xff0c; …

AMD Anti-Lag 2抗延迟技术落地 CS2首发、延迟缩短95%

AMD发布了全新重磅驱动程序Adrenalin 24.6.1版本&#xff0c;包括首发落地Anti-Lag 2抗延迟技术、优化支持新游戏、升级支持HYPR-Tune、支持新操作系统、优化AI加速与开发、扩展支持Agility SDK、修复已知Bug&#xff0c;等等。 一、Anti-Lag 2 今年5月份刚宣布&#xff0c;重…

【计算机毕业设计】基于Springboot的智能物流管理系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

信号与系统-实验6-离散时间系统的 Z 域分析

一、实验目的 1、掌握 z 变换及其性质&#xff1b;了解常用序列的 z 变换、逆 z 变换&#xff1b; 2、掌握利用 MATLAB 的符号运算实现 z 变换&#xff1b; 3、掌握利用 MATLAB 绘制离散系统零、极点图的方法&#xff1b; 4、掌握利用 MATLAB 分析离散系统零、极点的方法&a…

kicad第三方插件安装问题

在使用KICAD时想安装扩展内容&#xff0c;但是遇到下载失败&#xff0c;因为SSL connect error。 因为是公司网络&#xff0c;我也不是很懂&#xff0c;只能另寻他法。找到如下方法可以曲线救国。 第三方插件包目录 打开存放第三方插件存放目录&#xff0c;用于存放下载插件包…

vue3+vite+nodejs,通过接口的形式请求后端打包(可打包全部或指定打包组件)

项目地址https://gitee.com/sybb011016/test_build 打包通过按钮的形式请求接口&#xff0c;让后端进行打包&#xff0c;后端使用express-generator搭建模版。前端项目就在npm init vuelatest基础上添加了路由 如果只想打包AboutView组件&#xff0c;首先修改后端接口。 //打…

Linux如何安装openjdk1.8

文章目录 Centosyum安装jdk和JRE配置全局环境变量验证ubuntu使用APT(适用于Ubuntu 16.04及以上版本)使用PPA(可选,适用于需要特定版本或旧版Ubuntu)Centos yum安装jdk和JRE yum install java-1.8.0-openjdk-devel.x86_64 安装后的目录 配置全局环境变量 vim /etc/pr…

运营商、银行、国企等单位开发岗24届Offer薪资与福利汇总

本文介绍24届校园招聘中&#xff0c;地理信息科学&#xff08;GIS&#xff09;专业硕士研究生所得Offer的整体薪资情况、福利待遇等。 在2024届秋招与春招中&#xff0c;我累计投递了170余个单位&#xff0c;获得17个Offer&#xff1b;平均每投递10个简历才能获得1个Offer。说句…

2024年6月29日 每周新增游戏

图吧工具箱: 全名图拉丁吧硬件检测工具箱,是开源、免费、绿色、纯净的硬件检测工具合集,专为图钉及所有DIY爱好者制作,包含常用硬件测试和检测工具,月工JS必备! iGuzheng爱古筝iguzheng古筝是一款可以在线模拟古筝练习的软件&#xff0c;用户可以直接在手机上练习古筝&#xff…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月30日,星期日

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年6月30日 星期日 农历五月廿五 1、 气象台继续发布暴雨红色预警&#xff1a;30日&#xff0c;安徽、湖南等地局地有特大暴雨。 2、 稀土管理条例公布&#xff1a;任何组织和个人不得侵占或者破坏稀土资源。 3、 暑期全国将…

ubuntu丢失网络/网卡的一种原因解决方案

现象 开机进入ubuntu后发现没有网络&#xff0c;无论是在桌面顶部状态栏的快捷键 还是 系统设置中&#xff0c;都没有”有线网“和”无线网“的选项&#xff0c;”代理“的选项是有的使用数据线连接电脑和手机&#xff0c;手机开启”通过usb共享网络“&#xff0c;还是没有任何…

Parzen 窗估计法

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…

一文弄懂逻辑回归算法

1. 引言 今天我们将深入探讨另一种基本的机器学习算法&#xff1a;逻辑回归。在前两篇文章中&#xff0c;我们使用线性回归和梯度下降法帮助我们的朋友马克确定了他 2400 平方英尺房子的理想售价。 最近马克再次向我们求助。他住在一个高档社区&#xff0c;他认为低于一定面积…

docker pull 镜像的时候遇到Pulling fs layer问题

最近遇到一个很奇怪的问题,docker pull 镜像的时候,总是出现Pulling fs layer问题,导致镜像拉取不成功,以前是安装好docker,正常拉取镜像都是没什么问题的,在这里记录一下这个问题的解决方法,当然,可能并不通用。 1、进入阿里云容器服务 地址:https://cr.console.aliy…

宝藏网站推荐,这些网站不可不知

在如今网络信息爆炸的时代&#xff0c;想要在众多网站中查找筛选一些好用的宝藏网站不是一件容易的事情。下面小编就来和大家分享几个值得推荐的宝藏网站&#xff0c;可以极大的提高大家上网效率&#xff0c;涵盖办公&#xff0c;学习&#xff0c;生活各个方面。 一、b站 b站…

IDEA中导入Maven项目

相关内容&#xff1a; Maven的安装与配置 在IDEA中配置Maven环境 在IDEA中创建Maven项目 IDEA中Maven配置依赖和排除依赖 IDEA中导入Maven项目 方式1&#xff1a;使用Maven面板&#xff0c;快速导入项目 打开IDEA&#xff0c;选择右侧Maven面板&#xff0c;点击 号&…

基于DSMM数据安全能力建设方案的落地性评估指标

写在前面&#xff1a; 随着信息技术的迅猛发展&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;数据安全问题也随之而来&#xff0c;如何确保数据的安全性、完整性和可用性&#xff0c;已成为企业面临的重要挑战。DSMM&#xff08;数据安全能力成熟度模型&#x…

路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划&#xff08;Matlab&#xff09; 1.利用蜣螂算法DBO优化栅格地图机器人路径规划&#xff0c;效果如图所示&#xff0c;包括迭代曲线图、栅格地图等等&#xff5e…