java方法引用语法规则以及简单案例

目录

  • 一、方法引用
    • 1.1 什么是方法引用
    • 1.2 方法引用的语法规则
    • 1.3 构造器引用
    • 1.4 方法引用的简单案例
  • 参考资料

一、方法引用

1.1 什么是方法引用

方法引用是 Lambda 表达式的一种简写形式,用于表示已有方法的直接引用

类似于lambda表达式,方法引用也不是一个对象。不过,为一个类型为函数式接口的变量赋值时会生成一个对象。

考虑以下的例子,假设有一个字符串列表,我们希望将列表中的每个字符串映射成其长度。

List<String> strings = Arrays.asList("apple", "banana", "orange");// Lambda 表达式实现
List<Integer> lengths = strings.stream().map(s -> s.length()).collect(Collectors.toList());// 使用方法引用
List<Integer> lengths = strings.stream().map(String::length).collect(Collectors.toList());

在这个例子中,String::length 是一个方法引用,它指向字符串的 length 方法。通过使用方法引用,我们避免了显式地编写 Lambda 表达式,使代码更为简洁。

方法引用的使用并不仅限于实例方法,还可以用于静态方法和构造函数。总体而言,方法引用提供了一种更为简洁、清晰的方式来表达某些场景下的代码逻辑。

1.2 方法引用的语法规则

方法引用的语法规则相对简单,要用 ::运算符分隔方法名与对象或类名,可以分为3种主要的形式:

1.  object::instanceMethod   //  对象引用,引用特定对象的实例方法。
2.  Class::instanceMethod    //  类引用,  引用特定类的实例方法。
3.  Class::staticMethod      //  类引用,  引用特定类的静态方法。
4.  super::instanceMethod

在第1种情况下,方法引用等价于向方法传递参数的lambda表达式。对于System.out::println,对象是System.out,所以方法表达式等价于x ->System.out.println(x)
对于第2种情况,第1个参数会成为方法的隐式参数。例如,String::.compareToIgnoreCase 等同于 (x,y) ->x.compareToIgnoreCase(y)
在第3种情况下,所有参数都传递到静态方法 Math::pow 等价于 (x, y) ->Math.pow(x,y)

注意,只有当lambda表达式的体只调用一个方法而不做其他操作时,才能把 lambda表达式重写为方法引用。考虑以下lambda表达式:

s -> s.length( ) == 0

这里有一个方法调用。但是还有一个比较,所以这里不能使用方法引用。

1.3 构造器引用

构造器引用与方法引用很类似,只不过方法名为new。

  • 类构造器引用: 类名::new

    // Lambda 表达式
    Supplier<List<String>> lambda = () -> new ArrayList<>();// 类构造器引用
    Supplier<List<String>> constructorRef = ArrayList::new;
    
  • 数组构造器引用: 类型[]::new

    // Lambda 表达式
    Function<Integer, int[]> lambda = size -> new int[size];// 数组构造器引用
    IntFunction<int[]> arrayConstructorRef = int[]::new;
    

Java有一个限制,无法构造泛型类型T的数组。数组构造器引用对于克服这个限制很有用。表达式new T[n]会产生错误,因为这会改为new Object[n]。

流库利用构造器引用解决了这个问题。举个例子,存在Person类, 可以把Person[]: :new传入toArray方法:

Person[] people = stream.toArray(Person[] : : new);

1.4 方法引用的简单案例

请添加图片描述

参考资料

java lambda方法引用总结——烧脑吃透 - 知乎 (zhihu.com)

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

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

相关文章

window系统使用ESP8266开发板(CP2102)

连接开发板到电脑 虚拟机中选择连接的开发板硬件 查看设备管理器 更新驱动: CP210x USB to UART Bridge VCP Drivers - Silicon Labs 驱动安装成功

day03、关系模型之基本概念

关系模型之基本概念 1.关系模型概述1.1 关系模型三要素基本结构&#xff1a;relation/Table基本操作:relation operator 2.什么是关系3.关系模型中的完整性约束 本视频来源于B站&#xff0c;战德臣老师 1.关系模型概述 1.1 关系模型三要素 基本结构&#xff1a;relation/Table…

could not find a ready tiller pod

是 kubelet 的一个bug&#xff0c;在多container pod 的情况下有可能出现&#xff08;概率很小&#xff09; github 上已经有 PR&#xff0c;但是官方尚未合入代码 重启pod可恢复。长期来看&#xff0c;需要等待官方合入代码&#xff0c;更新版本。 解决&#xff1a; kubect…

水仙花数.

//水仙花数 #include<stdio.h> int main() { int i,a,b,c; for(i100;i<999;i) { int ai%10; int b(i/10)%10; int ci/100; if(ia*a*ab*b*bc*c*c) printf("%d ",i); } return 0; } 所谓“水仙花数”是指一个3位数&#xff0c;其各位数字立方之和等于该数本身…

使用docker实现logstash同步mysql到es

准备工作&#xff1a; 1.有mysql的连接方式&#xff0c;并且可以连接成功 2.有es的连接方式&#xff0c;并且可以连接成功 3.安装了docker 环境是Ubuntu中安装了docker 一、创建配置文件&#xff0c;用于容器卷挂载 # 切换目录&#xff0c;可自定义 cd /home/test/ # 创建lo…

FlieZilla服务器配置与数据访问、传输

概述 手机apk当初服务器&#xff0c;PC端访问手机端的数据&#xff0c;再没有数据线的情况下&#xff0c;非常方便。希望各位同仁搞起来&#xff0c;在此做个笔录。 安装包下载链接&#xff1a;https://download.csdn.net/download/qq_36075612/88577274 一、下载安装包&…

2023.12.12 关于 Java 反射详解

目录 基本概念 定义 用途 反射相关的类 反射基本原理 Class 类中的相关方法 常用获得类相关的方法 常用获得类中属性相关的方法 常用获得类中构造器相关的方法 常用获得类中方法相关的方法 实例理解 反射优缺点 基本概念 定义 Java 的反射&#xff08;reflection&a…

C++学习-2023/12/13-C++类型转换

C类型转换 static_cast 类似C语言强制类型转换 1.可以用做基本数据类型转换 2.把空类型的指针转换为目标指针类型 3.不能转换带有const属性指针 const_cast 提供一个常属性的接口 reinterpret_cast 说基本没用到 dynamic_cast:多态才会接触到 #include <iostream>…

MFC(Microsoft Foundation Classes)中 MessageBox

在MFC&#xff08;Microsoft Foundation Classes&#xff09;中&#xff0c;MessageBox是一个常用的对话框类&#xff0c;用于显示消息框并与用户进行交互。MessageBox类提供了多种用法和选项&#xff0c;以下是一些常见的用法和示例说明&#xff1a; 显示简单的消息框&#x…

算法笔记—链表、队列和栈

链表、队列和栈 1. 链表1.1 单链表反转1.2 双链表反转1.3 合并两个有序链表1.4 链表相加1.5 划分链表 2. 队列和栈2.1 循环队列2.2 栈实现队列2.3 队列实现栈2.4 最小栈2.2 双端队列 1. 链表 1.1 单链表反转 力扣 反转链表 // 反转单链表public ListNode reverseList(ListNod…

【RTOS学习】模拟实现任务切换 | 寄存器和栈的变化

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;认识任务切换&#x1f3d0;切换的实质&#x1f3d0;栈中的内容&#x1f3d0;切…

PHP中如何连接数据库并执行查询?

在 PHP 中&#xff0c;连接数据库并执行查询通常需要使用数据库扩展库。在大多数情况下&#xff0c;你可以使用以下两个扩展库&#xff1a; MySQLi&#xff08;MySQL Improved&#xff09;&#xff1a; MySQLi 是 MySQL 官方推荐的扩展库&#xff0c;提供了面向对象和面向过程两…

面试经典150题(15-19)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第七天&#xff09;完成了5道(15-19)150&#xff1a; 今天这些都是我之前做过的&#xff0c;还有就是今天的全都是模拟过程。。所以做的还算快。 15&#xff08;13. 罗马数字转整数&#xff09; 题目描述&a…

基于ssm的前后端分离鲜花销售系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本鲜花销售系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

java中的包

1.包的本质分析(原理) 包的本质 实际上就是创建不同的文件夹来保存类文件 2.一个文件中有两个类的i情况 package com.use;import com.xiaoqiang.Dog;public class Test {public static void main(String[] args) {Dog dog new Dog();System.out.println(dog); //com.xiaoqian…

PHP中什么是闭包(Closure)?

在PHP中&#xff0c;闭包&#xff08;Closure&#xff09;是一种匿名函数&#xff0c;它可以作为变量传递、作为参数传递给其他函数&#xff0c;或者被作为函数的返回值。闭包可以在定义时捕获上下文中的变量&#xff0c;并在以后的执行中使用这些变量。闭包在处理回调函数、事…

vos3000外呼系统的安装需求

VOS3000 是一款成熟的 VoIP 服务器软件&#xff0c;用于呼叫中心、运营商、企业等业务场景。它具有完善的电话交换、网络电话、接口对接和账户管理等功能&#xff0c;能够提供高效可靠的 VoIP 通信服务。有关技术问题欢迎和博主一起交流。 在安装和使用 VOS3000 之前&#xff…

安卓11双屏双背光修改方法

安卓11上调双屏异显功能&#xff0c;系统驱动默认支持双背光功能&#xff0c;老一点的系统不支持双背光驱动&#xff0c;所以老版本的双屏异显都是同时控制2个屏的背光&#xff0c;客户也没做特别要求&#xff0c;新版本客户有这个需求了&#xff0c;所以就想办法去实现&#x…

最新版ES8的client API操作 Elasticsearch Java API client 8.0

作者&#xff1a;ChenZhen 本人不常看网站消息&#xff0c;有问题通过下面的方式联系&#xff1a; 邮箱&#xff1a;1583296383qq.comvx: ChenZhen_7 我的个人博客地址&#xff1a;https://www.chenzhen.space/&#x1f310; 版权&#xff1a;本文为博主的原创文章&#xff…

“京东API接口技术大揭秘:让你轻松驾驭电商开发!“

京东平台API接口技术贴 一、概述 京东平台提供了丰富的API接口&#xff0c;方便开发者进行应用开发。这些API接口涵盖了商品信息、订单管理、用户认证等多个方面&#xff0c;为开发者提供了强大的支持。本文将详细介绍京东平台API接口的技术细节和使用方法。 二、API接口概述…