Java—JDK8新特性—方法引用【内含思维导图】

news2024/9/25 17:17:16

目录

 

4.方法引用

思维导图

4.1 什么是方法引用

4.2 为什么要使用方法引用

4.3 方法引用语法

4.4 方法引用的5种情况使用示例


4.方法引用

思维导图

4.1 什么是方法引用

        方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名称来指向一个方法,可以认为是 Lambda表达式的一个语法糖

        方法引用可以看作是Lambda表达式深层次的表达

        当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用

4.2 为什么要使用方法引用

        从前面学习中我们知道,Lambda 表达式已经简化了代码编写,那为什么还要有方法引用呢?

        使用了方法引用后,代码更加简洁

下面以一个案例来演示Lambda表达式的冗余场景。

import java.util.function.Consumer;

/**
 * 方法引用的引入
 * 1. instanceName::methodName  实例对象::实例方法名
 * 2. ClassName::staticMethodName 类名::静态方法名
 * 3. ClassName::methodName 类名::实例方法名
 * 4. ClassName::new    类名::构造方法名
 * 5. TypeName[]::new 数组类型[]:数组构造器名
 */
public class MethodReferenceDemo {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9,};
        sum1(arr);
        sum2((int[] ar) -> sum1(ar),arr);
        sum2(MethodReferenceDemo::sum1,arr);
    }
    /**
     * 使用Lambda表达式,求一个数组中元素的和
     */
    private static void sum1(int[] arr) {
        int sum = 0;
        for (int i : arr) {
            sum += i;
        }
        System.out.println("sum=" + sum);
    }

    private static void sum2(Consumer<int[]> consumer,int[] arr) {
        consumer.accept(arr);
    }
}

        此时,我们可以发现,使用了方法引用后,代码更加简洁了。
        注意:上例中双冒号::写法,这被称为“方法引用”,是一种新的语法。

4.3 方法引用语法

        方法引用是使用双冒号::操作符来将类(或对象)与方法名分隔开来

使用方式有如下5种情况:
        instanceName::methodName            实例对象::实例方法名
        ClassName::staticMethodName        类名::静态方法名

        ClassName::methodName                类名::实例方法名
        ClassName::new                               类名::构造方法名

        TypeName[]::new                              数组类型[]:数组构造器名

4.4 方法引用的5种情况使用示例

import java.util.Arrays;
import java.util.Date;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
/**
 * 方法引用的引入
 * 1. instanceName::methodName  实例对象::实例方法名
 * 2. ClassName::staticMethodName 类名::静态方法名
 * 3. ClassName::methodName 类名::实例方法名
 * 4. ClassName::new    类名::构造方法名
 * 5. TypeName[]::new 数组类型[]:数组构造器名
 */
public class MethodReferenceDemo1 {
    /**
     * 方法引用的使用实例
     *
     */
    public static void main(String[] args) {
        System.out.println("---1. instanceName::methodName  实例对象::实例方法名 ---");
        test01();
        System.out.println("---2. ClassName::staticMethodName 类名::静态方法名 ---");
        test02();
        System.out.println("---3. ClassName::methodName 类名::实例方法名 -----");
        test03();
        System.out.println("---4. ClassName::new    类名::构造方法名-----");
        test04();
        System.out.println("---5. TypeName[]::new 数组类型[]:数组构造器名-----");
        test05();
    }
    /**
     * 1. instanceName::methodName  实例对象::实例方法名
     *
     * 方法引用的注意事项:
     * 1.被引用的方法,参数要和接口中抽象方法的参数一样,
     *      如 now:: setTime会报错,因为这个方法有参数,而Supplier接口的get()方法没有参数。
     * 2.当接口抽象方法有返回值时,被引用的方法也必须有返回值
     */
    private static void test01() {
        // 创建一个对象
        Date date = new Date();

        //一般写法
        System.out.println(date.getTime());
        // Lambda表达式写法
        Supplier<Long> supplier1 = () -> date.getTime();
        System.out.println(supplier1.get());
        // 方法引用写法
        Supplier<Long> supplier2 = date::getTime;
        System.out.println(supplier2.get());
    }
    /**
     * 2. ClassName::staticMethodName 类名::静态方法名
     */
    private static void test02() {
        //获取字符串长度
        String str = "123456789";
        //一般写法
        System.out.println(str.length());
        // Lambda表达式写法
        Function<String,Integer> f1 = s -> s.length();
        Integer apply1 = f1.apply(str);
        System.out.println(apply1);
        // 方法引用写法
        Function<String,Integer> f2 =  String::length;
        Integer apply2 = f2.apply(str);
        System.out.println(apply2);

    }
    /**
     * 3. ClassName::methodName 类名::实例方法名
     */
    private static void test03() {
        long l = System.currentTimeMillis();
        //一般写法
        System.out.println(l);
        // Lambda表达式写法
        Supplier<Long> supplier1 = () -> System.currentTimeMillis();
        System.out.println(supplier1.get());
        // 方法引用写法
        Supplier<Long> supplier2 =  System::currentTimeMillis;
        System.out.println(supplier2.get());
    }
    /**
     * 4. ClassName::new    类名::构造方法名
     */
    private static void test04() {
        //无参构造
        // Lambda表达式写法
        Supplier<User> supplier1 = () -> new User();
        System.out.println(supplier1.get());
        // 方法引用写法
        Supplier<User> supplier2 = User::new;
        System.out.println(supplier2.get());

        //有参构造
        // Lambda表达式写法
        BiFunction<String,Integer,User> bf1 = (name,age) -> new User(name,age);
        User user1 = bf1.apply("张三", 12);
        System.out.println(user1);
        // 方法引用写法
        BiFunction<String,Integer,User> bf2 = User::new;
        User user2 = bf1.apply("李四", 13);
        System.out.println(user2);
    }
    /**
     *  5. TypeName[]::new 数组类型[]:数组构造器名
     */
    private static void test05() {
        // Lambda表达式写法
        Function<Integer,int[]> f1 = len ->new int[len];
        int[] apply1 = f1.apply(5);
        System.out.println(Arrays.toString(apply1));
        // 方法引用写法
        Function<Integer,int[]> f2 = int[]::new;
        int[] apply2 = f2.apply(6);
        System.out.println(Arrays.toString(apply2));
    }
}

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

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

相关文章

Word怎么分页,提高效率就靠这3种方法!

案例&#xff1a;Word怎么分页 【文档要进行分页处理&#xff0c;但是我尝试了好多次还是不行&#xff01;大家知道Word怎么分页吗&#xff1f;】 在使用Microsoft Word处理文档时&#xff0c;我们常常需要进行分页操作。Word的分页功能可以将文档分成多个页面&#xff0c;以…

【Vue3 插件篇】GSAP 动画库与 图片预览插件

GSAP 动画库 GSAP&#xff08;GreenSock Animation Platform&#xff09;是一个专业的动画库&#xff0c;可以用它完成你想要的各种效果 官网地址&#xff1a;https://greensock.com/ 参考文章一&#xff1a;https://www.jianshu.com/p/a8e150f0e569 参考文章二&#xff1a…

利用MQ事务消息实现分布式事务

MQ事务消息使用场景 消息队列中的“事务”&#xff0c;主要解决的是消息生产者和消息消费者的数据一致性问题。 拿我们熟悉的电商来举个例子。一般来说&#xff0c;用户在电商 APP 上购物时&#xff0c;先把商品加到购物车里&#xff0c;然后几件商品一起下单&#xff0c;最后…

为游客提供完美旅程:携程集团携手亚马逊云科技联合创新

刚刚过去的“五一”假期&#xff0c;旅游行业展现出了强劲的复苏势头。经文化和旅游部数据中心测算&#xff0c;全国国内旅游出游合计2.74亿人次&#xff0c;同比增长70.83%。 然而&#xff0c;出行前的航班高铁订票、酒店商旅预订、出游行程安排&#xff0c;就已经让不少家庭为…

C++linux高并发服务器项目实践 day9

Clinux高并发服务器项目实践 day9 信号集信号集相关函数以下信号集相关的函数都是对自定义的信号集进行操作sighandler_t函数sigaction函数 SIGCHLD信号共享内存共享内存使用步骤共享内存操作函数 信号集 许多信号相关的系统调用都需要能表示一组不同的信号&#xff0c;多个信…

深度思考:在 AI 时代,你会被放大一千倍的能力是什么?

Datawhale干货 作者&#xff1a;艾芙&#xff0c;复旦大学&#xff0c;百姓AI教育负责人 前言 大家晚上好&#xff0c;我是艾芙&#xff0c;百姓 AI 的 AI 教育负责人。 先做一下自我介绍&#xff0c;我是一个在技术圈和教育圈反复横跳的斜杠中年了。大约在 5 年前&#xff0c…

C++格式输入输出

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;数据结构 &#x1f525;座右铭&#xff1a;“不要等到什么都没…

常用的数据中心部署架构

说起数据中心&#xff0c;相信大家并不陌生。随着互联网行业的蓬勃发展&#xff0c;大数据时代的快速到来&#xff0c;数据中心同我们的生活紧密联系&#xff0c;息息相关。我们日常生活中的各种数据几乎都存储在数据中心里&#xff0c;例如&#xff1a;手机照片的云端备份、放…

Python小姿势 - # Python相关技术知识点

Python相关技术知识点 标题 在Python中如何处理文件 如果你要处理文件&#xff0c;那么在Python中你需要使用到os模块中的一些方法。 首先&#xff0c;你需要使用os.path.exists方法来判断文件是否存在&#xff1a; python if os.path.exists(file.txt): print(文件存在) else:…

asp.net企业员工考勤管理系统

企业员工管理系统主要是为企业内部管理员工使用的&#xff0c;主要功能分为员工和管理员两部分&#xff0c;主要的功能有用户登录&#xff0c;管理员信息管理&#xff0c;公告信息管理&#xff0c;文件审批管理&#xff0c;员工信息管理&#xff0c;工资信息管理&#xff0c;奖…

全景丨0基础学习VR全景制作,平台篇第19章:热点功能-文本

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 功能说明 应用场景 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的交互&#xff0c;增加用户的多元化体验。 文本热点&#xff0c;即点击热点后会弹出…

一顿饭的事儿,搞懂了Linux5种IO模型

大家好&#xff0c;我是老三&#xff0c;人生有三大难题&#xff0c;事业、爱情&#xff0c;和 ——这顿吃什么&#xff01; 人在家中躺&#xff0c;肚子饿得响&#xff0c;又到了不得不吃的时候&#xff0c;这顿饭该怎么吃&#xff1f;吃什么呢&#xff1f; Linux里有五种I…

【笔记】【HTTP】《图解HTTP》第1章 了解Web及网络基础

前言 有输入就要有产出&#xff0c;该笔记是本人看完《图解HTTP》后对每章涉及到的知识进行汇总博客将会已书的每章为一篇发布&#xff0c;下一篇博客发布时间不确定笔记中有些个人理解后整理的笔记&#xff0c;可能有所偏差&#xff0c;也恳请读者帮忙指出&#xff0c;谢谢。…

在Notion AI 中轻松打造您的AI私人助理,提供卓越的工作体验

大家好&#xff0c;我是瓜叔。 相信平时喜欢做笔记的人对notion 选应该不陌生近年来越来越多人开始把notion 选当做他们的主力笔记软件。 我自己也用了约4年的时间。如果你也是notion的爱好者但还不知道notion AI是什么。那这篇文章&#xff0c;我会分享我是如何实际操作使用技…

Windows terminal+wsl+ohmyzsh+powerlevel10k打造更美丽的终端

安装wsl 安装 WSL 和 Linux 的默认 Ubuntu 发行版。 了解详细信息https://learn.microsoft.com/zh-cn/windows/wsl/install。 还可以使用此命令通过运行 wsl --install 来安装其他 Linux 发行版。 若要获取发行版名称的有效列表&#xff0c;请运行 wsl --list --online。 wsl -…

AIOps探索 | 新形势下,中小银行如何学好数字化转型“必修课”?

一、强化数智驱动 推进转型升级 2023年4月21日&#xff0c;在江苏省支付清算服务协会、山东省支付清算协会的大力支持下&#xff0c;由金科创新社&#xff08;鑫知&#xff09;主办的“2023农村中小银行数字化转型研讨会”在江苏南京成功举办。 ​本次大会以“强化数智驱动 推…

深入浅出堆—C语言版【数据结构】

二叉树概念博客&#xff1a;http://t.csdn.cn/XIW84 目录 1. 了解堆 1.1 堆的概念 1.2 堆的性质&#xff1a; 1.3 堆的结构图片 1.3.1 小堆 1.3.2 大堆 2. 堆的实现 2.1 插入数据进堆 2.2 向上调整函数 2.3 堆的删除 2.4 向下调整 3. 堆的应用 3.1 建堆&#xff…

赚钱单页产品

今天写一篇文章&#xff0c;讲一个最近看的赚钱单页产品。 先下定义&#xff0c;什么是赚钱的单页产品&#xff1a; 能赚钱&#xff1a;需求切的准单页产品&#xff1a;通常只有少数几个页面就完成了产品的核心功能&#xff0c;一个程序员可以在1天左右&#xff0c;完成开发 先…

快速理解基本的cookie、session 和 redis

一、Cookie 1、什么是Cookie 1、Cookie实际上是一小段的文本信息&#xff0c;是一种keyvalue形式的字符串。客户端请求服务器&#xff0c;如果服务器需要记录该用户状态&#xff0c;就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 2、当浏览器再请求…

跨境电商系统开发需要注意的问题

跨境商城系统开发需要考虑许多特殊问题&#xff0c;比如涉及跨国支付、物流、法律和政策、文化差异等等。下面将列出一些重要的问题&#xff0c;来帮助您更有效地开发跨境电商系统。 1、税务问题 当涉及跨国交易时&#xff0c;涉及不同国家和地区的税收政策和税率。特别是在国…