Java 8 新特性 Ⅱ

news2024/11/27 4:29:25

方法引用

  • 举例: Integer :: compare

  • 理解: 可以看作是基于lambda表达式的进一步简化

    • 当需要提供一个函数式接口的实例时, 可以使用lambda表达式提供实例

      • 当满足一定条件下, 可以使用方法引用or构造器引用替换lambda表达式
  • 实质: 方法引用作为函数式接口的实例 (注: 需要熟悉所使用函数式接口中的抽象方法)

  • 格式:

    • 类(或 对象) :: 方法名
  • 对象 :: 实例方法 (非静态方法)

    • 要求: 函数式接口的抽象方法a与其内部实现时调用的对象的某个方法b的形参列表和返回值类型一致
  • 类 :: 静态方法

    • 要求: 函数式接口的抽象方法a与其内部实现时调用的类的某个静态方法b的形参列表和返回值类型一致
  • 类 :: 实例方法

    • 要求: 函数式接口的抽象方法a与其内部实现时调用的对象的某个方法b的返回值类型相同。同时, 抽象方法a有 n个参数, 方法b中有n-1个参数, 且抽象方法a的第一个参数作为方法b的调用者, 且抽象方法a的后n-1个参数与 方法b的后n-1个参数的类型相同

接下来的是代码的演示以及输出的结果

  1. 对象 :: 实例方法
// 1. 对象 :: 实例方法
@Test
public void test1(){
    Consumer<String> con1 = new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    };
    con1.accept("hello1");
    System.out.println("===================");
    // 2. lambda表达式 (只有一个形参时, 小括号可以省)
    Consumer<String> con2 = s -> System.out.println(s);
    con2.accept("hello2");
    System.out.println("===================");
    // 3. 对象 :: 调用方法
    Consumer<String> con3 = System.out::println; // 只写方法名
    con3.accept("hello3");
}

运行效果:

对象::实例方法

  1. 类 :: 静态方法
@Test
public void test2(){
    // 1. 匿名函数
    Comparator<Integer> com1 = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(o1, o2); // 兼容 int, 并且这是静态方法, 所以用类来引用, 泛型只能存放包装类型 
        }
    };
    System.out.println(com1.compare(12, 23)); // 前面小, 输出 -1
    System.out.println("=========================");
    // 2. lambda
    Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
    System.out.println(com2.compare(23,21));
    System.out.println("=========================");
    // 3. 引用函数
    Comparator<Integer> com3 = Integer :: compare;
    System.out.println(com3.compare(23,11));
}

运行效果:

类::静态方法

  1. 类 :: 实例方法
// 3. 类 :: 实例方法
@Test
public void test3(){
    // 1.
    Comparator<String> com1 = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2); // 形参列表不一样, 返回值一样 1个参数调用 n-1为被调用的参数
        }
    };
    System.out.println(com1.compare("abc","cdf"));
    System.out.println("========================");
    // 2. lambda表达式
    Comparator<String> com2 = (o1, o2) -> o1.compareTo(o2); // 只是表达式有所差异, 执行速度一样
    System.out.println(com2.compare("abb","abb"));
    System.out.println("=====================");
    // 3. 方法引用
    Comparator<String> com3 = String::compareTo; // 返回值的类 :: 实例方法
    System.out.println(com3.compare("ssa","aac")); // 第一个参数小, 返回负数; 相等 返回0; 第一个数大, 返回正数
}

运行效果:

输出结果

构造器引用

可以看作是特殊的方法

  • 格式: 类名 :: new

  • 说明

    • 调用类名对应的类中的某一个确定的构造器
    • 调用哪一个构造器? 取决于函数式接口的抽象对象的形参列表
// 构造器引用
@Test
public void test1(){
    //1.
    Supplier<Employee> sup1 = new Supplier<Employee>() {
        @Override
        public Employee get() {
            return new Employee(); // 构造器, 创建对象
        }
    };
    System.out.println(sup1.get()); // 会调用无参构造
    // 2. 方法引用
    Supplier<Employee> sup2 = Employee :: new;
    System.out.println(sup2.get());
}

Employee.java 就是拥有 age, id, name, salary属性以及构造器 setter, getter, toString方法的文件

运行效果:

运行结果

数组引用

  • 格式: 数组名[] :: new
@Test
public void test2(){
    Function<Integer, Employee[]> func1 = new Function<Integer, Employee[]>() {
        @Override
        public Employee[] apply(Integer length) {
            return new Employee[length];
        }
    };
    System.out.println("============");
    // 2. 数组引用
    Function<Integer, Employee[]> fun2 = Employee[] :: new;
    System.out.println(fun2.apply(100).length);
}

运行效果:

输出结果

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

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

相关文章

【AOA-VMD-LSTM分类故障诊断】基于阿基米德算法AOA优化变分模态分解VMD的长短期记忆网络LSTM分类算法(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

人大金仓获评“2023年度软件和信息技术服务名牌企业”

近日&#xff0c;中国电子信息行业联合会在2023世界数字经济大会暨第十三届智慧城市与智能经济博览会上&#xff0c;发布了“2023年度软件和信息技术服务名牌企业”&#xff0c;凭借在企业规模、技术创新、市场影响力等方面的突出表现&#xff0c;人大金仓成功入选。 此次评选在…

计组03:20min导图复习 中央处理器

&#x1f433;前言 图源&#xff1a;文心一言 考研笔记整理&#xff0c;纯复习向&#xff0c;思维导图基本就是全部内容了&#xff0c;不会涉及较深的知识点~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画思维导图~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;…

【数值分析】2 - 插值法

文章目录 一、引言1.1 插值法引入1.2 常用插值法1.3 插值法定义 二、插值法研究的问题2.1 插值多项式存在的唯一性2.2 如何构造n次多项式2.2.1 待定系数法2.2.2 拉格朗日插值法2.2.2.1 拉格朗日多项式2.2.2.2 拉格朗日插值余项2.2.2.3 例题2.2.2.4 拉格朗日插值法的问题 2.2.3 …

【大疆智图】大疆智图(DJI Terra 3.0.0)安装及使用教程

大疆智图是一款以二维正射影像与三维模型重建为主的软件,同时提供二维多光谱重建、激光雷达点云处理、精细化巡检等功能。它能够将无人机采集的数据可视化,实时生成高精度、高质量三维模型,满足事故现场、工程监测、电力巡线等场景的展示与精确测量需求。 文章目录 1. 安装D…

shell学习脚本04(小滴课堂)

他就可以直接读出来了。不需要在sh后面加参数。 可以用-s隐藏内容&#xff1a; 可以用-t进行指定几秒后显示。 -n限制内容长度。 输入到长度为5自动打印。 我们把-s放到-p后面的话&#xff1a; 这样会出错。 如果最后加5m会一直闪烁。 大家可以按照需求自行使用。

42907-2023 硅锭、硅块和硅片中非平衡载流子复合寿命的测试 非接触涡流感应法

1 范围 本文件描述了用非接触式涡流感应法测试太阳能电池用单晶硅锭、硅块和硅片中非平衡载流子复 合寿命的方法。 本文件适用于非平衡载流子复合寿命在0.1μs&#xff5e;10000 μs、电阻率在0.1 Ω cm&#xff5e;10000 Ω cm 的硅锭、硅块和硅片的测试。其中瞬态光电导衰…

Spring定时任务@Scheduled

在 Spring 框架中&#xff0c;可以使用定时任务来执行周期性或延迟执行的任务。Spring 提供了多种方式来配置和管理定时任务。有Java自带的java.util.Timer类&#xff0c;也有强大的调度器Quartz&#xff0c;还有SpringBoot自带的Scheduled。 在实际应用中&#xff0c;如果没有…

实际项目中如何进行问题排查

Linux自带 文本操作 文本查找 - grep文本分析 - awk文本处理 - sed文件操作 文件监听 - tail文件查找 - find网络和进程 网络接口 - ifconfig防火墙 - iptables -L路由表 - route -nnetstat其他常用 进程 ps -ef | grep java分区大小 df -h内存 free -m硬盘大小 fdisk -l | gr…

STM32F4_USB读卡器(USB_Slave)/USB U盘(Host)

前言 STM32F4芯片自带了USB OTG FS&#xff08;FS&#xff0c;即全速&#xff0c;12Mbps&#xff09;和USB OTG HS&#xff0c;支持USB Host和USB Device。 1. USB简介 USB&#xff0c;是英文Universal Serial BUS&#xff08;通用串行总线&#xff09;的缩写&#xff0c;是一…

硬盘无法分区的原因以及3种解决方法!

硬盘无法分区的原因 无论是新买的硬盘还是用了很久的硬盘&#xff0c;在分区过程中都可能会遇到硬盘无法分区的问题。在这里我们总结了以下几点原因&#xff1a; 主板生产商为了防止病毒侵入引导区文件在主板进行了设置&#xff0c;导致硬盘无法进行分区。 新买的硬盘没有…

42910-2023 无机胶粘剂高温压缩剪切强度试验方法

1 范围 本文件描述了在高温条件下测定无机胶粘剂压缩剪切强度的试验方法。 本文件适用于300℃~1000℃温度范围内&#xff0c;耐热陶瓷、复合材料及其他非金属材料之间搭接压缩 剪切强度的测定。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可…

一、BurpSuite基本界面学习

一、Dashboard 1.Scan Scan功能&#xff1a;能够对网站进行爬行&#xff08;主要发现网站可交互的接口和网址关联的路径&#xff0c;结果显示在Target&#xff09;和代码审计&#xff08;除了爬行的效果外&#xff0c;一定程度上会进行漏洞发现与查找&#xff09; 重点&#…

VMware17.0安装教程(2023最新最详细)

目录 一.简介 二.安装步骤 软件&#xff1a;VMware版本&#xff1a;17.0语言&#xff1a;简体中文大小&#xff1a;554.98M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.6GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a; htt…

如何快速从Oracle迁移到Mysql?

database 一、使用navicat工具二、问题 一、使用navicat工具 1、选择工具中的数据传输 2、源选Oracle,目标选Mysql,一直点下一步 二、问题 1、navicat连接oracle报错:Oracle library is not loaded navicat是通过oracle的客户端连接oracle的,报这个错是因为navicat for or…

SpringBoot 入门 参数接收 必传参数 数组 集合 时间接收

接口声明 RestController //表示该类为请求处理类public class HttpDeal {RequestMapping("/login")//这个方法处理哪一个地址过来的请求public String hello(){return "返回给浏览器";}}接收参数 RequestMapping("/login")public String logi…

【tg】2:视频采集的输入和输出

属于libtgcalls模块使用了 media thread和 worker thread 代码分布 视频采集 对外的interface :VideoCaptureInterface static std::unique_ptr<VideoCaptureInterface> Create(std::shared_ptr<Threads> threads

看《软技能》的读后感

最近在图书大夏看了一本书的一部分&#xff0c;书名是《软技能》。本人看到了几个有意思的观点。一是接一些兼职项目。 二是分享自己的技术&#xff0c;让同事能干自己的工作&#xff0c;让自己的工作变得别人也能干&#xff0c;才有机会让自己的职位提升。 三是让手动操作变…

一个功能强大的Flutter开源聊天列表插件

flutter_im_list是一款高性能、轻量级的Flutter聊天列表插件。可以帮助你快速创建出类微信的聊天列表的效果。 目录 预览图示例视频教程如何使用API 预览图 整体长按输入中动图 示例 Examples 视频教程 欢迎通过视频教程学习交流。 如何使用 第一步添加依赖 在项目根…