当前位置: 首页 > news >正文

Java8新特性2——方法引用

Java8新特性2——方法引用

注:以下内容基于Java 8,所有代码都已在Java 8环境下测试通过

目录:

  • Java8新特性1——函数式接口&lambda表达式
  • 方法引用
  • Stream

1. 方法引用

方法引用提供了一种替代 lambda 表达式的语法,允许以更简洁的方式使用 lambda 表达式,特别是在需要传递方法或者函数作为参数时。

方法引用本质是 lambda 表达式的语法糖,如果一个 lambda 表达式仅仅是调用了另外一个方法,此时可用方法引用替换此 lambda 表达式

方法引用仅仅是简化了 lambda 表达式的写法,因此方法引用并不能脱离 lambda 表达式单独使用。

2. 使用方法

方法引用使用引用运算符 :: 指向一个方法,有以下几种常见写法:

  • 引用构造函数
  • 引用静态方法
  • 引用成员函数
  • 引用某个类型的任意对象的实例方法

3. 引用构造函数

分为构造器引用和数组构造函数引用。

3.1 构造器引用

语法格式:

类名::new

如:

lambda表达式:

() -> new String()

等价于

构造器引用

String::new

使用示例:

public class Main {public static void main(String[] args) {MyInterface myClassLambda = (x) -> new MyClass(x);//lambda 表达式myClassLambda.f(10);MyInterface myClassFunction = MyClass::new;//方法引用myClassFunction.f(20);}
}class MyClass {/*** 参数:整型* 返回值:MyClass类型*/MyClass(int arg) {System.out.println("有参构造器,参数是" + arg);}
}@FunctionalInterface
interface MyInterface {/*** 参数:整型* 返回值:MyClass类型*/MyClass f(int a);
}

3.2 数组构造函数引用

语法格式:

数据类型[]::new

如:

lambda表达式:

() -> new int[]

等价于

数组构造函数引用

int[]::new

使用示例:

import java.util.function.IntFunction;public class Main {public static void main(String[] args) {IntFunction<int[]> intArrayLambda = (len) -> new int[len];//lambda 表达式intArrayLambda.apply(10);IntFunction<int[]> intFunction = int[]::new;//方法引用intFunction.apply(10);}
}

注:IntFunction 是 Java 内置的函数式接口,可用于创建泛型数组。

4.引用静态方法

语法格式:

类名::静态方法名

如:

lambda表达式:

(x) -> Math.sin(x)

等价于

方法引用

Math::sin

使用示例:

public class Main {public static void main(String[] args) {MyInterface sinLambda = (x) -> Math.sin(x);//lambda 表达式MyInterface sinFunction = Math::sin;//方法引用System.out.println(sinLambda.sin(1.2));System.out.println(sinFunction.sin(1.2));}
}@FunctionalInterface
interface MyInterface {double sin(double x);
}

5. 引用成员函数

可以分为以下三种:

  • 使用对象
  • 使用 super 关键字(引用超类)
  • 使用 this 关键字

以 this 关键字为例,另外两种类似

语法格式:

this::成员函数名

如:

lambda表达式:

(s) -> this.fun(s)

等价于

方法引用

this::fun

使用示例:

public class Main extends Father {public static void main(String[] args) {new Main().test();}private void test() {//lambda 表达式MyInterface lambda1 = (s) -> new Main().fun(s);MyInterface lambda2 = (s) -> super.fun(s);MyInterface lambda3 = (s) -> this.fun(s);lambda1.f("lambda1");lambda2.f("lambda2");lambda3.f("lambda3");//方法引用MyInterface function1 = new Main()::fun;MyInterface function2 = super::fun;MyInterface function3 = this::fun;function1.f("function1");function2.f("function2");function3.f("function3");}void fun(String s) {System.out.println("调用子类中的 fun:" + s);}
}class Father {void fun(String s) {System.out.println("调用父类中的 fun:" + s);}
}@FunctionalInterface
interface MyInterface {void f(String s);
}

6. 引用某个类型的任意对象的实例方法

使用示例:

import java.util.Arrays;public class Main {public static void main(String[] args) {String[] strings = {"abc", "ghi", "def"};Arrays.sort(strings, String::compareToIgnoreCase);for (String s : strings) {System.out.println(s);}}
}

相关文章:

Java8新特性2——方法引用

Java8新特性2——方法引用 注&#xff1a;以下内容基于Java 8&#xff0c;所有代码都已在Java 8环境下测试通过 目录&#xff1a; Java8新特性1——函数式接口&lambda表达式方法引用Stream 1. 方法引用 方法引用提供了一种替代 lambda 表达式的语法&#xff0c;允许以更…...

Mac“其他文件”存放着什么?“其他文件”的清理方法

很多Mac用户在清理磁盘空间时发现&#xff0c;内存占用比例比较大的除了有iCloud云盘、应用程序、影片、音频、照片等项目之外&#xff0c;还有一个“其他文件”的项目磁盘占用比也非常大&#xff0c;想要清理却无从下手。那么Mac“其他文件”里存放的是什么文件&#xff1f;我…...

46、TCP的“三次握手”

在上一节中&#xff0c;TCP首部常用的几个选项&#xff0c;有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后&#xff0c;下面我们开始学习TCP的连接建立。 TCP的一个特点是提供可靠的传输机制&#xff0c;还有一个特点就是TCP…...

libudev 和 libusb 常见API分析

libudev详解: libudev是Linux系统下的一个库&#xff0c;它提供针对内核提供的udev设备管理服务的函数库。udev是一种内核机制&#xff0c;用于在系统中传递解决方案的有关设备信息&#xff0c;以及在出现设备事件&#xff08;如删除、插入设备&#xff09;时触发相应的操作。 …...

[dasctf]misc04

与他不说一模一样吧也差不多 第三届红明谷杯CTF-【MISC】-阿尼亚_keepb1ue的博客-CSDN客flag.zip需要解压密码&#xff0c;在图片中发现一串密文。一串乱码&#xff0c;尝试进行字符编码爆破。获取到密码&#xff1a;简单的编码。https://blog.csdn.net/qq_36618918/article/d…...

Scala的函数式编程与高阶函数,匿名函数,偏函数,函数的闭包、柯里化,抽象控制,懒加载等

Scala的函数式编程 函数式编程 解决问题时&#xff0c;将问题分解成一个一个的步骤&#xff0c;将每个步骤进行封装&#xff08;函数&#xff09;&#xff0c;通过调用这些封装好的步骤&#xff0c;解决问题。 例如&#xff1a;请求->用户名、密码->连接 JDBC->读取…...

Axure RP 8.1.0.3400(原型设计工具)

Axure RP 8是一款原型设计工具&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户创建高质量的网页、移动应用和桌面软件原型。以下是Axure RP 8的一些特色介绍&#xff1a; 强大的交互设计&#xff1a;Axure RP 8支持创建复杂的动画和过渡效果&#xff0c;让你的原型更…...

企业微信、飞书、钉钉机器人消息发送工具类

1、实例化WebClient对象 其实你也可以使用RestTemplate&#xff0c;我这里主要是用到了webflux框架&#xff0c;所以需要实例化客户端请求对象 Bean public WebClient webClient(){HttpClient httpClient getHttpClient();return WebClient.builder().clientConnector(new R…...

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能&#xff0c;怎么实现&#xff0c;提供一份整体逻辑&#xff1a;包括主函数和功能函数 主函数逻辑&#xff1a; 1. 读图,两张rgb&#xff08;cv::imread&#xff09; 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数&#xff1a;keypoints…...

Mac安装Dart时,Homebrew报错 Error: Failure while executing

前言&#xff1a; 最近准备开发Flutter项目时&#xff0c;在安装环境时&#xff0c;安装Homebew时遇到了以下报错信息&#xff0c;在这里分享一下。 报错信息&#xff1a; ~ % brew tap dart-lang/dart > Tapping dart-lang/dart Cloning into /opt/homebrew/Library/Tap…...

SSM整合~

构建并配置项目&#xff1a; 第一步&#xff1a;创建maven项目 第二步&#xff1a;配置pom.xml文件 设置打包方式&#xff1a; 为了方便部署&#xff0c;我们通常情况下&#xff0c;将项目打包为WAR&#xff0c;因为WAR文件是一种可执行的压缩文件&#xff0c;它可以将项目…...

Self-supervised 3D Human Pose Estimation from a Single Image

基于单幅图像的自监督三维人体姿态估计 主页&#xff1a; https://josesosajs.github.io/ imagepose/ 源码&#xff1a;未开源 摘要 我们提出了一种新的自我监督的方法预测三维人体姿势从一个单一的图像。预测网络是从描绘处于典型姿势的人的未标记图像的数据集和一组未配对…...

ubuntu下cups部分场景

第一章&#xff1a;部分操作指令 在计算机领域中&#xff0c;cups 是“通用UNIX打印系统”&#xff08;Common UNIX Printing System&#xff09;的缩写&#xff0c;它是一种用于在UNIX-like操作系统上管理打印任务的开源打印系统。cups 提供了一个框架&#xff0c;允许用户和…...

通过geoserver imageMosic发布多张tif数据

通过geoserver imageMosic发布多张tif数据 reference: https://zhuanlan.zhihu.com/p/132388558 https://zhuanlan.zhihu.com/p/103674876 https://docs.geoserver.org/latest/en/user/tutorials/imagemosaic_timeseries/imagemosaic_timeseries.html 步骤 下载数据 http…...

输出图元(四)8-2 OpenGL画点函数、OpenGL画线函数

4.3 OpenGL画点函数 要描述一个点的几何要素&#xff0c;我们只需在世界坐标系中指定一个位置。然后该坐标位置和场景中已有的其他几何描述一起被传递给观察子程序。除非指定其他属性值&#xff0c;OpenGL 图元按默认的大小和颜色来显示。默认的图元颜色是白色&#x…...

java八股文

6. 如何保证消息的可靠性&#xff1f; 在RabbitMq的整个消息投递过程中&#xff0c;有三种情况下&#xff0c;会存在消息丢失的问题&#xff1a; 6. RabbitMq如何保证消息的可靠性&#xff1f; 所以从这三个维度保证消息的可靠性去可靠性传递就可以了&#xff0c;从生产者发送…...

算法通关村——解析堆的应用

在数组中找第K大的元素 LeetCode21 Medium 我们要找第 K 大的元素&#xff0c;如果我们找使用大堆的话那么就会造成这个堆到底需要多大的&#xff0c;而且哪一个是第 K 的的元素我们不知道是哪一个索引&#xff0c;我们更想要的结果就是根节点就是我们要找的值&#xff0c;所以…...

爬虫源码---爬取小猫猫交易网站

前言&#xff1a; 本片文章主要对爬虫爬取网页数据来进行一个简单的解答&#xff0c;对与其中的数据来进行一个爬取。 一&#xff1a;环境配置 Python版本&#xff1a;3.7.3 IDE:PyCharm 所需库&#xff1a;requests &#xff0c;parsel 二&#xff1a;网站页面 我们需要…...

Python的由来和基础语法(一)

目录 一、Python 背景知识 1.1Python 是咋来的? 1.2Python 都能干啥? 1.3Python 的优缺点 二、基础语法 2.1常量和表达式 2.2变量和类型 变量的语法 (1) 定义变量 (2) 使用变量 变量的类型 (1) 整数 (2) 浮点数(小数) (3) 字符串 (4) 布尔 (5) 其他 动态类型…...

使用maven创建springboot项目

创建maven快速启动项目 命令行或者idea、eclipse快捷创建也可以 pom.xml下project项目下导入springboot 父工程 <!--导入springboot 父工程--> <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.bo…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...