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

Java方法引用

2 方法引用

  • 在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作
  • 那么考虑一种情况: 如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,没有必要再写重复逻辑,如usePrintable(s -> System.out.println(s));中System.out.println(s)就是重复逻辑
  • 可以通过方法引用来使用已经存在的方案

2.1 方法引用符

  • 方法引用符

    • :: 该符号为引用运算符,而它所在的表达式被称为方法引用
  • 对比分析

    • Lambda表达式usePrintable(s -> System.out.println(s));
      分析:拿到参数s之后通过Lambda表达式,传递给System.out.println()方法去处理
    • 方法引用usePrintable(System.out:println);//隐含了把s参数给println方法
      分析:直接使用System.out中的println方法来取代Lambda,代码更加的简洁
  • 推导与省略

    • 如果使用Lambda,那么根据"可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
    • 如果使用方法引用,也是同样可以根据上下文进行推导
    • 方法引用是Lambda的李生兄弟(可以使用Lambda表达式就可以使用方法引用)
  • 范例

package test;public class Demo {public static void main(String[] args) {//Lambda表达式usePrintable(i -> {System.out.println(i); //888});//方法引用usePrintable(System.out::println); //888}private static void usePrintable(Printable p) {p.printInt(888);}
}

2.2 引用类方法

  • 常用方法引用

    • 引用类方法
    • 引用类的实例方法(成员方法)
    • 引用对象的实例方法
    • 引用构造器
  • 引用类方法,其实就是引用类的静态方法

  • 格式类名::静态方法

  • 范例Integer::parselnt
    Integer类的方法:public static int parseInt(String s)将此String转换为int类型数据

  • 练习
    在这里插入图片描述

  • 接口类

package test;public interface Converter {int convert(String s);
}
  • 测试类
package test;public class Demo {public static void main(String[] args) {
//        useConverter(s -> {
//            return Integer.parseInt(s);
//        });useConverter(s -> Integer.parseInt(s)); //666//引用类方法useConverter(Integer::parseInt); //666//Lambda表达式被类方法替代时,他的形式参数全部传给静态方法做参数;如s字符串传递给parseInt方法}private static void useConverter(Converter c) {int number = c.convert("666");System.out.println(number);}
}

2.3 引用类的实例方法(成员方法)

  • 引用类的实例方法,其实就是引用类中的成员方法

  • 格式类名::成员方法

  • 练习
    在这里插入图片描述

  • 接口

package test;public interface MyString {String mySubString(String s,int x,int y);
}
  • 测试类
package test;public class Demo {public static void main(String[] args) {
//        useMyString((String s,int x,int y)->{
//            return s.substring(x, y); //llo
//        });useMyString((s,x,y)-> s.substring(x, y)); // //llo//引用类中的实例方法useMyString(String::substring); //llo//Lambda表达式中的形式参数(s,x,y)//第一个参数作为调用者//后面的参数全部传给实例方法作为参数}public static void useMyString(MyString m) {String s = m.mySubString("HelloWorld", 2, 5);System.out.println(s);}
}

2.4 引用对象的实例方法(成员方法)

  • 引用对象的实例方法,其实就引用类中的成员方法

  • 格式对象名::成员方法

  • 范例"HelloWorld"::toUpperCase
    String类中的方法:public String toUpperCase()将此String所有字符转换为大写

  • 练习
    在这里插入图片描述

  • PrintString类

package test;public class PrintString {//把字符串转换成大写public void printUpper(String s) {String result = s.toUpperCase();System.out.println(result);}
}
  • 接口
package test;public interface Printer {void printUpperCase(String s);
}
  • 测试类
package test;public class Demo {public static void main(String[] args) {
//        usePrinter((String s ) -> {
            String result = s.toUpperCase();
            System.out.println(result); //HELLO
//            System.out.println(s.toUpperCase());
//        });usePrinter(s -> System.out.println(s.toUpperCase()));//引用对象的实例方法PrintString ps = new PrintString();usePrinter(ps::printUpper); //HELLO}public static void usePrinter(Printer p) {p.printUpperCase("hello");}
}

2.5 引用构造器

  • 引用构造器,就是引用构造方法

  • 格式类名::new

  • 范例Student::new

  • 练习
    在这里插入图片描述

  • 测试类

package test;public class Demo {public static void main(String[] args) {
//        useStudentBuilder((String name,int age) -> {
            Student s  =new Student(name,age);
            return s;
//            return new Student(name,age); //
//        });useStudentBuilder((name, age) -> new Student(name, age));useStudentBuilder(Student::new); //小黑,10//Lambda表达式被引用构造器代替时,他的形式参数全部传递给构造器作为参数}public static void useStudentBuilder(StudentBuilder sb) {Student s = sb.build("小黑", 10);System.out.println(s.getName() + "," + s.getAge());}
}

相关文章:

Java方法引用

2 方法引用 在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作那么考虑一种情况: 如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,没有必要再写重复逻辑,如usePrintable…...

C++教程之迭代器Iterator

前言 之前的两篇文章我们主要了解了vector和string的相关知识,从中我们知道可以通过下标来访问vector的元素或者string的字符,但是除了这种方式还有一种更为通用的方式获取元素,那就是迭代器,这篇文章就会简单介绍迭代器的相关内…...

容联七陌:ChatGPT大模型能力为智能客服带来新方向

科技云报道原创。 近几个月来,大众对ChatGPT预期的持续走高,也影响到了智能客服领域公司的命运。 一方面,ChatGPT的出现为智能客服场景带来了更加“智能”的可能性;但另一方面,有人认为ChatGPT完全可以替代现有的智能…...

【Linux 多线程同步】使用同步和互斥实现生产消费模型

目录 1.同步的接口 2.多线程但是按顺序来执行 3.生产消费模型 4.使用互斥加同步实现生产消费模型 (采用环形队列) 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题 …...

【TypeScript】TypeScript的接口和对象类型(interface):

文章目录一、使用接口约束的时候不能多一个属性也不能少一个属二、重名interface 可以合并,继承三、可选属性 使用?操作符四、任意属性 [propName: string]五、只读属性 readonly,是不允许被赋值的只能读取六、添加函数一、使用接口约束的时候不能多一个…...

7、函数与异常

目录一、函数的概念二、匿名函数三、闭包四、defer五、异常机制一、函数的概念 函数的基本形式 //函数定义。a,b是形参 func argf(a int, b int) { a a b } var x, y int 3, 6 argf(x, y) //函数调用。x,y是实参函数参数: func arg2(a, b int) { //参数类型相…...

Julia 语言环境安装

Julia 语言支持以下系统: LinuxFreeBSDmacOSWindowsAndroid Julia 安装包下载地址为:Download Julia。 Github 源码地址:GitHub - JuliaLang/julia: The Julia Programming Language。 国内镜像地址:Index of /julia-releases/…...

5.1 线程

文章目录1.概述2.多线程的特性2.1 随机性2.2 CPU分时调度2.3 线程的状态2.4 线程状态与代码对照3.多线程代码实现方式1:继承Thread3.1 概述3.2 常用方法3.3 测试多线程的创建方式14.多线程代码实现方式2:实现Runnable接口4.1 概述4.2 常用方法4.3 练习2:测试多线程的…...

通讯录的实现

一、目的:使用C实现通讯录二、包含功能:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信息删除联系人:按照姓名进行删除指定联系人…...

Urho3D导航

Urho3D通过使用Recast和Detour库实现导航网格生成和路径查找。 导航功能通过NavigationMesh和Navigable组件公开。 NavigationMesh从已使用Navigable组件标记的子节点收集几何体。默认情况下,可导航组件的行为是递归的:除非禁用递归,否则也…...

【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)

前段时间尝试了一款激光雷达和相机标定的代码,总结了博客: 【学习总结】激光雷达与相机外参标定:原理与代码 但总觉得那个代码太差劲,而且精度不行,于是又找了些新的代码,体验比之前的好很多,在…...

车载技术开发—{Android CarFrameWork}

Android Automotive平台 Android Automotive是通过Android的通用框架,语言和API来实现的一个全栈,开源,高度可定制的平台。 Android Automotive与整个Android生态系统的关系 Android Automotive是Android的一部分。 Android Automotive不是…...

多城市二手车买卖发布管理小程序开发

多城市二手车买卖发布管理小程序开发 功能特性: 为你介绍二手车微信小程序的功能特性。 车辆分类搜索,支持按品牌、售价、年龄、上牌时间、排量等筛选。 车源发布,支持用户一键发布二手车,平台审核上线,发布可编辑、删除等操作。…...

企业级信息系统开发学习笔记1.2 初探Spring——利用组件注解符精简Spring配置文件

文章目录零、本讲学习目标一、课程引入二、打开项目 - SpringDemo三、利用组件注解符精简Spring配置文件(一)创建新包(二)复制四个类(三)修改杀龙任务类(四)修改救美任务类&#xff…...

37、基于51单片机乒乓球比赛系统设计

摘要 乒乓球游戏电路是一个对输入信号、输入时机正确与否的8个LED表示乒乓球球台和乒乓球,用数码管模拟显示器,显示比赛局数比分和每局玩家得分的电路。电路并不复杂,整体分为两个模块:一,游戏主模块;二&a…...

VMware虚拟机安装Win11最详细过程以及遇到的这台电脑无法运行Windows11的问题

准备工作 在使用VMware虚拟机安装Win11之前我们先把准备工作做好,以免后续思绪混乱导致出错。 1. 到VMware官网或点击链接下载正版VMware Workstation 16 Pro。 2. 双击打开安装包,点击下一步。 3. 阅读用户许可协议,勾选我接受许可协议中的…...

centos误删python2后怎么重新安装

此教程为离线安装 一. 先查询系统版本 cat /proc/version Linux version 3.10.0-1127.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Mar 31 23:36:51 UTC 2020 二. 安装python2.7.5(已知原python版…...

Qt 开发使用VSCode 笔记2

在之前有写过使用VSCode开发QT的笔记 Qt 开发使用VSCode 在以前的基础上继续学习记录写下《Qt 开发使用VSCode 笔记2》 该笔记相比之前的Qt 开发使用VSCode新加了如下内容: 工作区的使用使用Natvis进行Qt感知对象可视化通过vscode创建QT Quick项目 工作区的使用 …...

查找算法复习

先序在了解查找算法之前,需要熟悉几个概念,不然后面容易产生理解错误。查找表:即被查找的对象,通常由几个关键字组成。关键字:就是数据项、字段的意思。关键字有主次之分,其中主关键字取值是唯一的。查找长…...

腾讯前端必会面试题(必备)

如何提取高度嵌套的对象里的指定属性? 有时会遇到一些嵌套程度非常深的对象: const school {classes: {stu: {name: Bob,age: 24,}} }像此处的 name 这个变量,嵌套了四层,此时如果仍然尝试老方法来提取它: const {…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

WebRTC调研

WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

密码学基础——SM4算法

博客主页:christine-rr-CSDN博客 ​​​​专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...