Java里面的方法引用

Java里面的方法引用

方法引用

  • 引用处必须是函数式接口

  • :: 方法引用符

  • 被引用的地方必须已经存在

  • 被引用方法的形参和返回值需要和抽象方法保持一致

  • 被引用方法的功能要满足当前需求

  1. 引用静态方法

    • 类名::静态方法
  2. 引用成员方法

    • 对象::成员方法

    • this::成员方法

    • super::成员方法

  3. 引用构造方法

    • 类名::new
  4. 使用类名引用成员方法

    • 不能引用所有类中的成员方法

    • 如果抽象方法的第一个参数类型是A类型的,只能引用A类中的方法

  5. 引用数组的构造方法

    • 数据类型[]::new

    • 例子:int[]::new

    什么是方法引用

把已经存在的方法拿过来用,当做函数式接口中抽象方法的方法体

在Java中,方法引用(Method References)是Java 8引入的一个新特性,它允许你直接引用现有Java类或对象的方法或构造器。这可以被视为Lambda表达式的一种简化表示法,在不需要传递任何参数,或者只需要从某个对象的实例调用方法时特别有用。

方法引用的作用

方法引用主要用于简化Lambda表达式的编写,使得代码更加简洁和易于理解。在很多情况下,方法引用可以提供一种比Lambda表达式更加清晰、直观的表达方式。

方法引用的分类和使用

方法引用主要分为四类:

  1. 静态方法引用:通过类名直接引用静态方法。
List<String> list = Arrays.asList("a", "b", "A", "B");
list.sort(String::compareToIgnoreCase);
  1. 特定对象的实例方法引用:通过对象实例引用实例方法。
String str = "Hello";
Predicate<String> startsWithHello = str::startsWith;
boolean result = startsWithHello.test("Hello World"); // true

注意,在这个例子中,startsWithHello引用的是str这个特定对象的startsWith方法,而不是String类的静态方法。
3. 特定类型的任意对象的实例方法引用:通过类名引用实例方法,但方法的第一个参数是实例本身的类型(即隐式参数this)。

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(String::toUpperCase); // 打印每个字符串的大写形式

在这个例子中,String::toUpperCase引用了String类的toUpperCase方法,并且Lambda表达式中的参数(即列表中的每个字符串)会自动作为该方法的第一个参数(即隐式参数this)。
4. 构造器引用:通过类名引用构造器。

Supplier<String> stringSupplier = String::new;
String s = stringSupplier.get(); // 创建一个新的空字符串Function<Integer, String> stringFunction = String::new;
String anotherS = stringFunction.apply(10); // 创建一个新的字符串,内容为"10"(但实际上这不会工作,因为String的构造器不接受int参数)

注意,在构造器引用的例子中,如果构造器接受参数,那么你需要使用合适的函数式接口来匹配这些参数。在上面的例子中,由于String类的构造器不接受Integer类型的参数,所以stringFunction.apply(10)实际上会编译失败。

方法引用是Java 8中Lambda表达式的一个重要组成部分,它允许你以更加简洁和直观的方式表达Lambda表达式的功能。通过方法引用,你可以减少代码的冗余,提高代码的可读性和可维护性。

例子

package com.mohuanan.exercise;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;public class Demo06 {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();//创建Student对象Student s1 = new Student("张三", 23);Student s2 = new Student("李四", 24);Student s3 = new Student("王五", 25);//添加到集合里面Collections.addAll(list, s1, s2, s3);//获取stream流/*String[] array = list.stream().map(new Demo06()::jointString).toArray(String[]::new);System.out.println(Arrays.toString(array));*/String[] array = list.stream().map(s -> s.getName() + s.getAge()).toArray(String[]::new);System.out.println(Arrays.toString(array));}public String jointString(Student stu){return ""+stu.getName()+stu.getAge();}
}

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

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

相关文章

【文献阅读】 The ITS Irregular Terrain Model(Longely-Rice模型)海上电波传播模型

前言 因为最近在做海上通信的一个项目&#xff0c;所以需要对海上的信道进行建模&#xff0c;所以才阅读到了这一篇文献&#xff0c;下面的内容大部分是我的个人理解&#xff0c;如有错误&#xff0c;请见谅。欢迎在评论区和我一起讨论。 Longely-Rice模型介绍 频率介于 20 …

leetcode刷题记录—二分

1 二分 33. 搜索旋转排序数组 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., num…

深入理解Linux内核:访问文件

目录 五种常见的模式 读写文件 从文件中读取数据 函数do_generic_file_read() 普通文件的readpage方法 块设备文件的readpage方法 文件的预读 page_cache_readahead()函数 handle_ra_miss()函数 写入文件 普通文件的prepare_write和commit_write方法 块设备文件的pr…

数据恢复软件:适用于 Windows 的 10 款最佳数据恢复软件

当您不小心丢失计算机硬盘驱动器中的数据时&#xff0c;您可能会发现自己处于尴尬的境地。当您无法找到所有重要数据和文件时&#xff0c;这真的很可怕。 但是&#xff0c;通过使用数据恢复软件&#xff0c;您可以在PC上恢复数据。 在这里&#xff0c;我们展示了 10 款最佳数据…

基于Spring Boot的外卖点餐系统设计与实现

基于Spring Boot的外卖点餐系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 网站首页界面图&#xff0c;通过进入网站可以查看首页、…

uniapp 禁止截屏(应用内,保护隐私)插件 Ba-ScreenShot

禁止截屏&#xff08;应用内&#xff0c;保护隐私&#xff09; Ba-ScreenShot 简介&#xff08;下载地址&#xff09; Ba-ScreenShot 是一款uniapp禁止应用内截屏的插件&#xff0c;保护隐私&#xff0c;支持禁止截屏、放开截屏 截图展示 也可关注博客&#xff0c;实时更新最…

用keras识别狗狗

一、需求场景 从照片从识别出狗狗 from keras.applications.resnet50 import ResNet50 from keras.preprocessing import image from keras.applications.resnet50 import preprocess_input, decode_predictions import numpy as np# 加载预训练的ResNet50模型 model ResNet5…

Linux Makefile之优化

1 概述 前面写了两篇关于Makefile的文章Linux Makefile编写之静态库和Linux Makefile编写之可执行程序.虽然编译没有问题&#xff0c;但还有优化的空间。 2 优化 优化列表&#xff1a; 目标文件放入单独目录。隐藏编译命令。增加头文件依赖。增量编译&#xff0c;只编译修改…

免安装SQL管理工具HeidiSQL建库如何选Collation字符校对

免安装SQL管理工具HeidiSQL 文章目录 免安装SQL管理工具HeidiSQL一、安装二、建库因此&#xff0c;通常我们选择&#xff1a; 一、安装 到官方网址&#xff1a;https://www.heidisql.com/ 下载后按不同版本安装或解压&#xff0c;运行目录中的heidisql应用程序。 该工具可以对…

【Linux系统编程】第十二弹---编辑器gcc/g++使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是gcc/g 2、gcc/g编辑器的安装 3、gcc/g编译的四个步骤 2.1、预处理 2.2、编译 2.3、汇编 2.4、链接 4、函数库 …

WSL2连接Windows主机的Mysql

文章目录 需求查看主机IP防火墙设置Mysql设置允许远程连接WSL2连接Mysql 需求 在WSL2&#xff08;本机Ubuntu20.04&#xff09;运行的程序需要将数据写入到本机的Mysql服务器中 查看主机IP 两种办法&#xff1a; Windows主机输入 ipconfig&#xff0c;找到带有WSL后缀的部分…

pytorch 实现语义分割 PSPNet

语意分割是指一张图片上包含多个物体&#xff0c;通过语义分割可以识别物体分类、物体名称、像素识别的任务。和物体检测不同&#xff0c;他不会将物体框出来&#xff0c;而是根据像素的归属把物体标注出来。PSPNet 的输入是一张图片&#xff0c;例如300500&#xff0c;那么输出…

计算机毕业设计python在线交友系统django+vue

Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框架更为灵活、轻便且容易上手&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。 本在线交友系统管理员功能有个人中心&#xff0c;用户管理&#xff…

OpenCV4.9去运动模糊滤镜(68)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV4.9失焦去模糊滤镜(67) 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习&#xff1a; 运动模糊图像的 PSF 是多少如何恢复运动模…

【千帆平台】使用AppBuilder三步手搓应用创建精准多轮对话agent之K12互动式练习题

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用头像应用名称应用描述角色指令能力扩展开场白 …

【Web】CTFSHOW 新手杯 题解

目录 easy_eval 剪刀石头布 baby_pickle repairman easy_eval 用script标签来绕过 剪刀石头布 需要赢100轮&#x1f914; 右键查看源码拿到提示 一眼session反序列化 打PHP_SESSION_UPLOAD_PROGRESS 脚本 import requestsp1 a|O:4:"Game":1:{s:3:"log…

ubuntu与redhat的不同之处

华子目录 什么是ubuntu概述 ubuntu版本简介桌面版服务器版 安装部署部署后的设置设置root密码关闭防火墙启用允许root进行ssh登录更改apt源安装所需软件 网络配置Netplan概述配置详解配置文件DHCP静态IP设置设置 软件安装方法apt安装软件作用常用命令配置apt源 deb软件包安装概…

服务器分类

服务器可以根据不同的标准进行分类&#xff0c;主要分类方式包括但不限于以下几种&#xff1a; 按应用层次划分&#xff1a; 入门级服务器&#xff1a;适用于小型企业或个人&#xff0c;处理轻量级任务。工作组级服务器&#xff1a;适合中小型企业部门&#xff0c;支持更多用户…

EasyExcel 处理 Excel

序言 本文介绍在日常的开发中&#xff0c;如何使用 EasyExcel 高效处理 Excel。 一、EasyExcel 是什么 EasyExcel 是阿里巴巴开源的一个 Java Excel 操作类库&#xff0c;它基于 Apache POI 封装了简单易用的 API&#xff0c;使得我们能够方便地读取、写入 Excel 文件。Easy…

selenium 4.x 之验证码处理(python)

验证码处理 一般情况公司如果涉及web自动化测试需要对验证码进行处理的方式一般有一下几种&#xff1a; 关闭验证码功能&#xff08;开发处理&#xff09;设置万能验证码&#xff08;开发处理&#xff09;使用智能识别库进行验证 通过第三方打码平台识别验证码 1. 跳过验证功…