02-详细介绍Java8新特性方法引用,构造引用,数组引用

方法/构造/数组引用

方法引用

当要传递给Lambda体的操作已经有实现的方法时就可以使用方法引用,方法引用和构造器引用就是为了简化Lambda表达式

  • 方法引用可以看做是Lambda表达式深层次的表达,方法引用本质还是Lambda表达式所以也是函数式接口的一个实例
  • 通过方法的名字来指向一个方法可以认为是Lambda表达式的一个语法糖

语法糖(Syntactic sugar)也译为糖衣语法是指计算机语言中添加的某种对语言的功能没有影响但是更方便程序员使用的语法

  • 使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会

方法引用格式: 使用方法引用操作符 “::” 将类或对象方法名分隔开来,要求Lambda体只有一句语句并且是调用一个对象/类的方法

  • 因为引用的方法的形参和返回值函数式接口抽象方法的形参和返回值都相同,所以引用方法的形参可以省略
  • 情况1:对象::实例方法名
  • 情况2:类::静态方法名
  • 情况3:类::实例方法名

先写一个Employee实体类

public class Employee {private String name;private Integer id;// get和set方法public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}// 构造方法public Employee() {}public Employee(Integer id) {this.id = id;this.name = name;}public Employee(Integer id,String name) {this.id = id;this.name = name;}
}

**对象::非静态方法:接口抽象方法a在被重写时使用了某一个对象的方法b,如果方法a和b的形参列表,返回值类型都相同,则可以使用方法b实现对方法a的重写替换 **

  • Consumer中的void accept(T t)和PrintStream中的void println(T t)形参列表均为(T t)以及返回值均为void
  • Supplier中的T get()和Employee中的String getName()形参列表均为空以及返回值均为String
@Test
public void test() {// 使用Lambda表达式Consumer<String> consumer01 = s -> System.out.println(s);consumer01.accept("她的手只有我的手四分之三那麼大");System.out.println("-----------------------------");// 使用方法引用//PrintStream printStream = System.out;//Consumer<String> consumer02 = printStream::println;Consumer<String> consumer02 = System.out::println;consumer02.accept("可我還是沒能抓住");
}
@Test
public void test() {Employee emp = new Employee(1001,"Tom");// 使用Lambda表达式Supplier<String> sup1 = () -> emp.getName();System.out.println(sup1.get());System.out.println("*******************");// 使用方法引用Supplier<String> sup2 = emp::getName;System.out.println(sup2.get());}

类::静态方法: :接口抽象方法a在被重写时使用了某一个类的静态方法b,如果方法a和b的形参列表,返回值类型都相同,则可以使用方法b实现对方法a的重写替换

  • Comparator中的int compare(T t1,T t2)和Integer中的int compare(T t1,T t2)形参列表均为(T t1,T t2)以及返回值均为int
  • Function中的R apply(T t)和Math中的Long round(Double d)返回值和参数列表为泛型
@Test
public void test07() {// 使用Lambda表达式Comparator<Integer> comparator01 = (o1, o2) -> Integer.compare(o1, o2);System.out.println(comparator01.compare(20, 77));System.out.println("----------------------------");// 使用方法引用Comparator<Integer> comparator02 = Integer::compare;System.out.println(comparator02.compare(94, 21));
}@Test
public void test08(){// 使用Lambda表达式Function<Double,Long> function01 = aDouble -> Math.round(aDouble);System.out.println(function01.apply(3.141));System.out.println("------------------------------");// 使用方法引用Function<Double,Long> function02 = Math::round;System.out.println(function02.apply(2.717));
}

类::实例方法: 抽象方法a在被重写时使用了某一个对象的方法b,如果方法a和b的返回值类型相同但方法b的形参少一个,则可以使用方法b实现对方法a的重写替换

  • 方法a的形参列表中有n个参数方法b有n-1个参数,方法a的第1个参数作为方法b的调用者,方法a的后n-1个参数与方法b的n-1个参数匹配(类型相同或满足多态)
  • Comparator中的int comapre(T t1,T t2)方法和String中的int t1.compareTo(t2)方法
  • BiPredicate中的boolean test(T t1, T t2)方法和String中的boolean t1.equals(t2)方法
  • Function中的R apply(T t)方法和Employee中的String toString()方法
@Test
public void test5() {// 使用Lambda表达式Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);System.out.println(com1.compare("abc","abd"));System.out.println("*******************");// 使用方法引用Comparator<String> com2 = String :: compareTo;System.out.println(com2.compare("abd","abm"));
}@Test
public void test10(){// 使用Lambda表达式BiPredicate<String,String> biPredicate01 = (o1, o2) -> o1.equals(o2);System.out.println(biPredicate01.test("Kyle", "Kyle"));// trueSystem.out.println("----------------------------------");// 使用方法引用BiPredicate<String,String> biPredicate02 = String::equals;System.out.println(biPredicate02.test("Violet", "Violet"));// true
}@Test
public void test7() {Employee employee = new Employee(1001, "Jerry");// 使用Lambda表达式Function<Employee,String> func1 = e -> e.getName();System.out.println(func1.apply(employee));System.out.println("*******************");// 使用方法引用Function<Employee,String> func2 = Employee::getName;System.out.println(func2.apply(employee));
}@Test
public void test11(){Ememployee employee = new Employee(1001, "Jerry");Function<Stu,String> function01 = employee -> employee.toString();System.out.println(function01.apply(employee));System.out.println("------------------------------");Function<Employee,String> function02 = Employee::toString;System.out.println(function02.apply(employee employee));
} 

构造器引用

类名::new: 要求Lambda体只有一句语句并且是用来创建一个对象,构造方法的形参列表和返回值(构造器对应类的对象)要与接口中抽象方法一致才可以替换

  • Supplier中的T get()和Employee的无参构造方法Employee()

  • Function中的R apply(T t)和Employee的有参构造方法Employee(id)

  • BiFunction中的R apply(T t,U u)和Employee的有参构造方法Employee(id,name)

@Test
public void test1(){// 传统写法Supplier<Employee> sup = new Supplier<Employee>() {@Overridepublic Employee get() {return new Employee();}};System.out.println("*******************");// Lambda表达式Supplier<Employee>  sup1 = () -> new Employee();System.out.println(sup1.get());System.out.println("*******************");// 构造器引用Supplier<Employee>  sup2 = Employee :: new;System.out.println(sup2.get());
}@Test
public void test2(){// Lambda表达式Function<Integer,Employee> func1 = id -> new Employee(id);Employee employee = func1.apply(1001);System.out.println(employee);System.out.println("*******************");// 构造器引用Function<Integer,Employee> func2 = Employee :: new;Employee employee1 = func2.apply(1002);System.out.println(employee1);}@Test
public void test3(){// Lambda表达式BiFunction<Integer,String,Employee> func1 = (id,name) -> new Employee(id,name);System.out.println(func1.apply(1001,"Tom"));System.out.println("*******************");// 构造器引用BiFunction<Integer,String,Employee> func2 = Employee :: new;System.out.println(func2.apply(1002,"Tom"));}

数组构造引用

数组类型名[]::new: 要求Lambda体只有一条语句并且是创建一个数组对象,接口中抽象方法的形参接收的是数组对象的长度

  • Function中的R apply(T t)和String[]
@Test
public void test4(){// Lambda表达式Function<Integer,String[]> func1 = length -> new String[length];String[] arr1 = func1.apply(5);System.out.println(Arrays.toString(arr1));System.out.println("*******************");// 数组引用Function<Integer,String[]> func2 = String[] :: new;String[] arr2 = func2.apply(10);System.out.println(Arrays.toString(arr2));}

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

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

相关文章

小红书关键词搜索商品列表API接口(分类ID搜索商品数据接口,商品详情接口)演示案例

通过关键词搜索商品API接口&#xff0c;电商平台可以为消费者提供一个简单、快捷的商品搜索功能。用户只需输入关键词&#xff0c;就可以得到与该关键词相关的商品列表。关键词搜索商品API接口还可以提供给第三方开发者一个便捷的商品搜索服务。开发者可以利用该接口&#xff0…

Mac安装配置typescript及在VSCode上运行ts

一、Mac上安装typescript sudo npm install -g typescript 测试一下&#xff1a;出现Version则证明安装成功 tsc -v 二、在VSCode上运行 新建一个xxx.ts文件&#xff0c;测试能否运行 console.log("helloworld") 运行报错&#xff1a;ts-node: command not…

后渗透持久性-– 服务控制管理器

执行以下命令将快速检索服务控制管理器实用程序的 SDDL 权限。 sc sdshow scmanager服务控制管理器 – 安全描述符 PowerShell 还可用于枚举所有用户组的 SDDL 权限并将其转换为可读格式。 $SD Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Schedule\S…

shell 条件语句 if case

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 &#xff08;全真才为真&#xff09; 或 &#xff08;一真即为真&#xff09; 常见条件 双中括号 [[ expression ]] 用法 &…

美国服务器在大陆连不上怎么回事?

​  在租用任何美国服务器之前&#xff0c;都需要先搞清楚一些使用问题&#xff0c;毕竟服务器能够不间断地访问也是站在们所期望的。但有时&#xff0c;美国服务器网站或许也会突然出现在大陆打不开的情况&#xff0c;在面临这种情况时&#xff0c;我们应该怎么做? 查看连不…

【史上最细教程】服务器MySQL数据库完成主从复制

文章目录 MySQL完成主从复制教程准备&#xff1a;原理&#xff1a;步骤&#xff1a; 推荐文章 MySQL完成主从复制教程 主从复制&#xff08;也称 AB 复制&#xff09;就是将一个服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从…

Java飞翔的鸟

创建三个包&#xff0c;存放代码。把图片放进文件中 APP包&#xff08;运行&#xff09; GameApp类 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包&#xff08;主内容&#xff09; Barri…

python获取json所有节点和子节点

使用python获取json的所有父结点和子节点 并使用父节点加下划线命名子节点 先展示一段json代码 {"level1": {"level2": {"level3": [{"level4": "4value"},{"level4_2": "4_2value"}]},"level2_…

电力行业的智能调度:数字孪生技术

随着科技的发展&#xff0c;数字孪生技术正逐渐渗透到各个行业领域&#xff0c;其中包括电力行业。数字孪生技术为电力行业带来了前所未有的机遇&#xff0c;使得电力系统的运行更加高效、安全和可持续。本文借用山海鲸可视化软件几个电力行业数字孪生案例探讨数字孪生技术在电…

介绍几种Go语言开发的IDE

文章目录 1.前言2.几种ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.总结写在最后 1.前言 Go语言作为一种新兴的编程语言&#xff0c;近年来受到了越来越多的关注。 它以其简洁、高效和并发性能而闻名&#xff0c;被广…

Jmeter 压测保姆级入门教程

1、Jmeter本地安装 1.1、下载安装 软件下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 选择一个压缩包下载即可 然后解压缩后进入bin目录直接执行命令jmeter即可启动 1.2 修改语言 默认是英文的&#xff0c;修改中文&#xff0c;点击…

关于解决C# WinForm中Chart控件增删数据时报错的解决方法

1.报错代码 System.InvalidOperationExceptionHResult=0x80131509Message=集合已修改;可能无法执行枚举操作。具体报错表现为,在Application.Run(Form1())中断。 2.解决方法 这个错误通常是由于在枚举集合时对集合进行了修改而引起的。在修改完chart控件中的内容后,可能会…

Linux---常用命令汇总

文章目录 关于目录操作的命令ls/llcdpwdmkdir 关于文件操作的命令touchechocatrmmvcpvim 关于查询操作的命令greppsnetstat 关于目录操作的命令 ls/ll ls : 列出当前目录下的目录和文件&#xff08;以行的展示形式&#xff09; ll &#xff1a; 列出当前目录下的目录和文件&…

Django之Cookie与Session,CBV加装饰器

前言 会话跟踪技术 在一个会话的多个请求中共享数据&#xff0c;这就是会话跟踪技术。例如在一个会话中的请求如下&#xff1a;  请求银行主页&#xff1b; 请求登录&#xff08;请求参数是用户名和密码&#xff09;&#xff1b;请求转账&#xff08;请求参数与转账相关的数…

Thread类常用成员方法

点击链接返回标题-> Java线程的学习-CSDN博客 目录 前言 有关线程名字的成员方法&#xff1a; String getName() void setName(String name) Thread(String name) 获取线程对象的成员方法&#xff1a; static Thread currentThread() 让线程睡眠的成员方法&#xff1…

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列&#xff0c;例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息&#xff0c;以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

python 数据类型之集合

常见的数据类型&#xff1a; int&#xff0c;整数类型&#xff08;整形&#xff09;bool&#xff0c;布尔类型str&#xff0c;字符串类型list&#xff0c;列表类型tuple&#xff0c;元组类型dict&#xff0c;字典类型&#xff0c;一个容器且元素必须是键值对。set&#xff0c;…

I Doc View在线文档预览系统RCE漏洞(QVD-2023-45061)

0x01 产品简介 iDocView是一个在线文档解析应用&#xff0c;旨在提供便捷的文件查看和编辑服务。 0x02 漏洞概述 漏洞成因 本次漏洞出现在在线文档解析应用中的远程页面缓存功能。具体问题在于该应用未能对用户输入的URL进行充分的安全验证&#xff0c;从而导致存在安全隐患…

前端实现菜单快速检索的功能

前端CSS <style type"text/css">.btn-box {color: #fff;width: auto;border-radius: 25px;min-width: 40px;height: 40px;margin: 9px;line-height: 40px;display: inline-block;position: relative;overflow: hidden;background-image: linear-gradient(315de…

红队攻防实战之内网穿透隐秘隧道搭建

别低头&#xff0c;皇冠会掉&#xff1b;别流泪&#xff0c;贱人会笑。 本文首发于先知社区&#xff0c;原创作者即是本人 0x00 前言 构建内网隐蔽通道&#xff0c;从而突破各种安全策略限制&#xff0c;实现对目标服务器的完美控制。 当我们从外网成功获得攻击点的时候&…