jdk8新特性-方法引用

2023-10-26

1、作用

什么是方法引用:方法引用是jdk8推出的一个新特性,在一定的条件下可以替换lambda表达式,可以理解为方法引用实际上还是一个lambda表达式。lambda表达式用法可参见:https://blog.csdn.net/xiao_yu_gan/article/details/124095300

方法引用的作用:可以在一定条件下简化lambda表达式写法,旨在编写更加简洁紧凑的代码风格,提高代码重用率,不提高执行效率。

可简单理解为:如果一个lambda表达式大括号中的代码仅仅是调用了另外一个方法,此时可用方法引用替换此lambda表达式。

注意:方法引用旨在简化lambda表达式写法,在lambda表达式的基础上使用,不能脱离lambda表达式单独使用。

2、语法

(函数式)接口类型 对象变量名 = 对象::被引用的实例方法;
(函数式)接口类型 对象变量名 = 类名::被引用的静态方法;
(函数式)接口类型 对象变量名 = 类名::被引用的普通方法;
(函数式)接口类型 对象变量名 = 类名::new(引用的是类的构造方法);

“=”号左边函数式接口抽象方法的参数列表、返回值类型需要与右边被引用的方法的参数列表、返回值类型一致。

3、演示使用

对象::实例方法

/**
 * 1、使用Date对象实例方法
 */
public class Demo {
    public static void main(String[] args) {
        Date date = new Date();
        /**
         * lambda表达式写法
         */
        Supplier<Long> currentTimeLambda = ()->date.getTime();
        System.out.println(currentTimeLambda.get());
        
        /**
         * 方法引用写法
         */
        Supplier<Long> currentTimeQuote = date::getTime;
        System.out.println(currentTimeQuote.get());
    }
}
/**
 * 2、使用自定义类对象实例方法
 */
public class Demo {
    public static void main(String[] args) {
        Person person = new Person("张三");
        /**
         * lambda表达式写法
         */
        Supplier<String> personNameLambda = ()->person.getName();
        System.out.println(personNameLambda.get());

        /**
         * 方法引用写法
         */
        Supplier<String> personNameQuote = person::getName;
        System.out.println(personNameQuote.get());
    }
}

class Person{
    private String name;

    public String getName() {
        return name;
    }

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

类名::静态方法

/**
 * 1、使用System类静态方法
 */
public class Demo {
    public static void main(String[] args) {
        /**
         * lambda表达式写法
         */
        Supplier<Long> currentTimeLambda = ()->System.currentTimeMillis();
        System.out.println(currentTimeLambda.get());

        /**
         * 方法引用写法
         */
        Supplier<Long> currentTimeQuote = System::currentTimeMillis;
        System.out.println(currentTimeQuote.get());
    }
}
/**
 * 2、使用自定义类静态方法
 */
public class Demo {
    public static void main(String[] args) {
        /**
         * lambda表达式写法
         */
        Supplier<String> personNameLambda = ()->Person.getName();
        System.out.println(personNameLambda.get());

        /**
         * 方法引用写法
         */
        Supplier<String> personNameQuote = Person::getName;
        System.out.println(personNameQuote.get());
    }
}

class Person{
    private static String name = "李四";

    public static String getName() {
        return name;
    }
}
/**
 * 3、使用带参数的方法引用
 */
public class Demo {
    public static void main(String[] args) {
        /**
         * lambda表达式写法
         */
        Function<Integer,Integer> squaredLambda = (val)->MyMath.squaredValue(val);
        System.out.println(squaredLambda.apply(3));

        /**
         * 方法引用写法
         */
        Function<Integer,Integer> squaredquote = MyMath::squaredValue;
        System.out.println(squaredquote.apply(5));
    }
}

class MyMath{
    /**
     * 求平方值
     */
    static Integer squaredValue(Integer val){
        return val*val;
    }
}

类名::new

public class Demo {
    public static void main(String[] args) {
        /**
         * lambda表达式写法
         */
        Supplier<Person> personLambda = ()->new Person();
        System.out.println(personLambda.get());

        /**
         * 方法引用写法(无参构造)
         */
        Supplier<Person> personQuoteNoPa = Person::new;
        System.out.println(personQuoteNoPa.get());

        /**
         * 方法引用写法(一个参数构造)
         */
        Function<String,Person> personQuoteOnePa = Person::new;
        System.out.println(personQuoteOnePa.apply("张三"));

        /**
         * 方法引用写法(两个参数构造)
         */
        BiFunction<String,Integer,Person> personQuoteTwoPa = Person::new;
        System.out.println(personQuoteTwoPa.apply("李四",24));
    }
}

class Person{
    private String name;
    private Integer age;

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

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

    public Person() {
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdk8新特性-方法引用 的相关文章

  • 检查 Java servlet 的 HTTP POST 请求的内容类型

    我编写了一个简单的 servlet 它接受 HTTP POST 请求并发回一个简短的响应 这是 servlet 的代码 import java io BufferedInputStream import java io ByteArrayI
  • PDFBox 更改线条颜色

    我使用 pdfbox 1 8 5 并尝试使用绘制彩色线PDPageContentStream drawLine 我尝试过PDPageContentStream setNonStrokingColor 255 0 0 但它不起作用 我也没有找
  • 如何将H2数据库文件存储到项目目录中

    当我使用H2数据库时 数据库文件存储在C Users MyName TestDataBase db目录 H2路径是jdbc h2 TestDataBase 这是默认的 H2 数据库路径 是否有可能像这样将 H2 数据库文件存储到我的项目目录
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • 改变 H2 中的序列

    我在生产中使用 Postgres 数据库 在测试中使用 H2 我想为现有表创建一个新序列 所以在 Liquibase 中我写了这个
  • 如何使 Java 中的自定义泛型类型链表排序?

    我正在用 java 编写自己的泛型链表 而不是使用 java 集合链表 链表的add方法由以下代码组成 public void add T item int position Node
  • 如何在 spring 中将模型作为重定向属性传递

    redirectModel addAttribute Model model return REDIRECT PREFIX my company organization management manage users 当我通过这个时 我得
  • Java 方法存根

    这就是我必须做的 为下面的 main 调用的方法定义存根 每个存根应打印 FIXME Finish methodName 后跟换行符 并应返回 1 输出示例 FIXME Finish getUserNum FIXME Finish getU
  • 根据使用频率随机生成字母?

    如何根据常用语音中的使用频率随机生成字母 任何伪代码都值得赞赏 但如果用 Java 实现就更棒了 否则 只需朝正确的方向戳一下就会有所帮助 注意 我不需要生成使用频率 我确信我可以很容易地查找到它 我假设您将频率存储为 0 到 1 之间的浮
  • 有没有一种简单的方法来加密java对象?

    我想将序列化对象存储到文件中 但我想对其进行加密 它不需要非常强的加密 我只是想要一些简单的东西 最好是最多几行代码 这会让其他人加载起来更加困难 我已经研究过 SealedObject 但关键是阻止我 理想情况下 我只想传递一个字符串作为
  • Java HTTPS客户端证书认证

    我对HTTPS SSL TLS我对客户在使用证书进行身份验证时到底应该提供什么内容感到有点困惑 我正在编写一个 Java 客户端 需要执行一个简单的操作POST数据到特定的URL 这部分工作正常 唯一的问题是它应该重新完成HTTPS The
  • 将 AOP 与 OSGI 结合使用的最佳解决方案?

    我正在使用 Equinox 因此 Equinox Aspect 项目似乎是理所当然的 但该项目似乎处于非活动状态 并且只有一页文档 让我最终悬而未决 除了那个项目之外 我没有看到在 OSGI 中使用 AOP 的很多选项 让我知道你们的想法以
  • 编写无 BOM 的 UTF-8

    这段代码 OutputStream out new FileOutputStream new File C file test txt out write A getBytes 和这个 OutputStream out new FileOu
  • 在 Apache POI 4.0 中为 XSSFWorkbook 创建自定义颜色样式

    要在 Apache POI 3 7 及更低版本中为 XSSFWorkbook 应用自定义颜色 可以执行以下操作 java awt Color c new java awt Color 1 2 3 XSSFCellStyle xcs xssf
  • 比较 Java 中的两个基元数组?

    我知道 Arrays deepEquals Object Object 但这不适用于原始类型 由于数组和自动装箱的限制 请参阅这个相关帖子 https stackoverflow com questions 517751 java gene
  • ZipInputStream.getNextEntry() 如何工作?

    假设我们有这样的代码 File file new File zip1 zip ZipInputStream zis new ZipInputStream new FileInputStream file 假设您有一个包含以下内容的 zip
  • 如何停止在控制台上打印异常堆栈跟踪?

    我编写了一个 Servlet 来处理 Web 应用程序中发生的异常 并将它们映射到 web xml 中
  • 了解 Collection.isEmpty() 和 Collection.size() == 0 之间的区别? [复制]

    这个问题在这里已经有答案了 我读过很多关于两者之间差异的文章isEmpty and size gt 0 用于检查collection是否为空并发现isEmpty 表现超过size 但我无法轻易理解为什么性能isEmpty 即使 isEmpt
  • Android 每个 Activity 中的通用进度条

    我已经修改了解决方案 我可以获得进度条 但进度条永远不会隐藏 这是创建具有相对布局的进度条的类 public class ProgressBarHandler private ProgressBar mProgressBar private
  • 从 Java 8 流中获取每个第 n 个元素

    假设我有一个这样的列表 1 2 3 4 5 6 7 8 9 10 是否可以使用 Java 8 流从该列表中获取每个第二个元素以获得以下内容 1 3 5 7 9 或者甚至可能是每三个元素 1 4 7 10 基本上 我正在寻找一个函数来获取流的

随机推荐

  • 微信小程序上传图片到阿里云OSS,读取上传后oss后的图片

    一 config js var fileHost xxxx aliyuncs com 你的阿里云oss地址 var config aliyun OSS config uploadImageUrl fileHost 默认存在根目录 可根据需求
  • Static Timing Analysis for Nanometer Designs A Practical Approach

    分享电子书籍 静态时序分析圣经 Static Timing Analysis for Nanometer Designs A Practical Approach 1 setup time Setup time 建立时间 是数据信号 D 在
  • 小程序 - 日期选择器

    效果图 实现步骤 1 创建组件 wxml
  • Unity3D控制Animator播放

    有一个需求 要求第一次打开一个界面触发一个动画播放 关闭界面动画播放关闭 再次打开界面继续上次到播放而不是重新开始播放 如果动画播放结束关闭打开界面入口 即无法在此进入该界面 有两种实现方法 方法1 第一次打开界面开始播放特效动画 调用an
  • AI—漂亮的花简单制作(含详细教程)

    暑假在家刷短视频 不 不 不 球球 别别别 平面制作搞起来 跟数媒小可爱学炒鸡有意思的AI吧 今天带来的是一朵漂亮的花 gt 效果图入下 步骤一 用 星形 工具 gt 角点数 为25 如图 gt 确定 步骤二 按住ALT键 复制一个星形 缩
  • 再也不用担心网吧开黑队友听不清了!降噪解决方案了解一下?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯游戏云发表于云 社区专栏 经常逛游戏论坛的朋友会深有感触 很多玩家经常会在论坛里吐槽在网吧开黑的体验很差 噪音太多 在游戏语音开黑的过程中 如果其中一个队友身处网吧 则其他
  • chronyc sources -V

    Chrony 是一个时钟同步工具 而 chronyc sources V 是它的命令行参数 用于显示当前时钟源的详细信息 使用这个参数后 会输出当前时钟源的信息 包括 源类型 IP 地址 可用性 偏差和误差等 通过这些信息 可以了解时钟源的
  • Linux 编译运行查找头文件和库的顺序

    linux中在使用gcc进行编译时 可能会出现找不到相应库或头文件的情况 往往让人十分头疼 因此 此文描述了库和头文件的查找顺序和一些注意事项 希望能帮助大家在出错时能够快速定位和解决 头文件 gcc在编译时按照如下顺序寻找所需要的头文件
  • set,env和export的区别

    http blog csdn net longxibendi article details 6125075 http blog chinaunix net uid 128922 id 289956 html set 显示 设置 shell
  • JSP编程手记------jsp页url中传中文参数乱码问题续

    一个偶然的机会 发现了一个解决jsp页url中传中文参数乱码的方法 比我前面说的用隐形的form表单来的更加漂亮和容易 具体方法如下 程序清单 response sendRedirect gh 0001 xm java net URLEnc
  • Qt手动设置Kits套件

    Qt编译器版本手动设置方式 文章目录 Qt编译器版本手动设置方式 前言 一 安装MSVC2019 32bit 二 手动设置kits套件 总结 前言 在给Qt Creator添加自定义控件时 遇到的版本问题让人头疼 我用的Qt5 12 10
  • 那一年读过的技术经典书

    转载请注明 http blog csdn net xinzhangyanxiang article details 10199757 大学刚毕业 总结起来读过的书并不算多 而且主要集中在大四的时期读的 在此把经典统一总结一遍 先总结机器学习
  • Qt信号和信号槽(二)

    目录 信号槽使用拓展 示例1 一个信号可以对应多个槽函数 在上篇文章的代码中进行修改 示例2 用信号连接信号 信号槽的连接方式 示例 Lambda表达式 语法格式 定义和调用 信号槽使用拓展 一个信号可以连接多个槽函数 发送一个信号有多个处
  • SpringBoot使用quartz, 注入feignClient, client为null

    使用 autowired 活着构造方法注入 打断点查看注入的feigncliet为null 搜索网上的一些博客 大致原因是因为quartz启动是通过反射将一些类注入进来 启动的时候引用这个类还没初始化好 下面是解决方案 使用spring 提
  • OpenRestry-demo

    openRestry 基于Nginx和lua的高性能web平台内置了大量lua库和第三方的模块 为了使用lua开发一些定制功能 安装环境 安装环境 yum y install pcre devel openssl devel gcc cur
  • 基本的传染病模型:SI、SIS、SIR及其Python代码实现

    本文主要参考博客 http chengjunwang com en 2013 08 learn basic epidemic models with python 该博客有一些笔误 并且有些地方表述不准确 推荐大家阅读Albert Lasz
  • 【腾讯云 Cloud Studio 实战训练营】通过云IDE构建Web3项目

    iOS开发上架主页 在强者的眼中 没有最好 只有更好 移动开发领域优质创作者 阿里云专家博主 文章目录 背景 一 前言 二 Cloud Studio 主要功能和应用场景 三 Cloud Studio 实验前期准备 3 1 打开官网 3 2
  • 在MATLAB中,用Simulink搭建一个二阶传递函数模型

    文章目录 1 模型准备 二阶传递函数模型 1 1 二阶传递函数模型 1 1 1 时域模型 1 1 2 频域模型 1 2 二阶传递函数公式和参数 2 开始建模 在simulink中搭建二阶传递函数模型 2 1 从simulink库中添加传递函
  • python选择文件夹,并自动发送这个文件夹下的所有文件(以附件的形式)至指定邮箱(通过163邮箱)

    工作中需要将自动生成的表格发送给办公邮箱继续处理 结合遍历文件夹和自动发邮件 做出了可以选择文件夹 并自动发送这个文件夹下的所有文件 以附件的形式 至指定邮箱 import smtplib from email mime multipart
  • jdk8新特性-方法引用

    1 作用 什么是方法引用 方法引用是jdk8推出的一个新特性 在一定的条件下可以替换lambda表达式 可以理解为方法引用实际上还是一个lambda表达式 lambda表达式用法可参见 https blog csdn net xiao yu