方法引用与构造方法引用

2024-06-03 05:20
文章标签 方法 引用 构造方法

本文主要是介绍方法引用与构造方法引用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

方法引用

什么是方法引用

构造方法引用

构造方法引用(也可以称作构造器引用)

数组构造方法引用


方法引用

什么是方法引用

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

方法引用可以看做是 Lambda 表达式深层次的表达。换句话说,方法引用就是 Lambda 表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是 Lambda 表达式的一个语法糖。

要求:实现接口的抽象方法的参数类列和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致。

格式:使用操作符 :: 将类(或者对象)与方法名分割开来

如下三种主要使用情况:

  • 对象 :: 实例方法名
  • 类 :: 静态方法名
  • 类 :: 实例方法名

示例

public class Person {private String name;private LocalDate birthday;public Person() {}public Person(String name) {this.name = name;}public Person(String name, LocalDate birthday) {this.name = name;this.birthday = birthday;}public String getName() {return name;}public void setName(String name) {this.name = name;}public LocalDate getBirthday() {return birthday;}public void setBirthday(LocalDate birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", birthday=" + birthday +'}';}public static int compareByAge(Person a, Person b) {return a.birthday.compareTo(b.birthday);}
}
public class MethodReferences {//情况一:对象 :: 实例方法//Consumer 中的 void accept(T t) 与 PrintStream 中的 void println(T t)@Testpublic void t1() {//原来的写法Consumer<String> consumer = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};consumer.accept("上海市");//lambda 写法Consumer<String> consumerL = str -> System.out.println(str);consumerL.accept("上海");//方法引用PrintStream out = System.out;Consumer<String> consumerM = out::println;consumerM.accept("shanghai");}//Supplier 中的 T get() 与 Person 中的 String getName()@Testpublic void t2() {Person person = new Person("小威", LocalDate.of(2016, 9, 1));//原来的写法Supplier<String> supplier = new Supplier<String>() {@Overridepublic String get() {return person.getName();}};System.out.println(supplier.get());//lambda 写法Supplier<String> supplierL = () -> person.getName();System.out.println(supplierL.get());// 方法引用Supplier<String> supplierM = person::getName;System.out.println(supplierM.get());}
//======================================================================================================================//情况二:类 :: 静态方法//Comparator 中的 int compare(T t1,T t2) 与 Integer 中的 int compare(T t1,T t2)@Testpublic void t3() {//原来的写法Comparator<Integer> comparator = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1, o2);}};System.out.println(comparator.compare(520, 1314));//lambda 写法Comparator<Integer> comparatorL = (o1, o2) -> Integer.compare(o1, o2);System.out.println(comparatorL.compare(100, 99));// 方法引用Comparator<Integer> comparatorM = Integer::compareTo;System.out.println(comparatorM.compare(123, 321));}//Function 中 R apply(T t) 与 Math 中 Long round(Double d)@Testpublic void t4() {//原来的写法Function<Double, Long> function = new Function<Double, Long>() {@Overridepublic Long apply(Double aDouble) {return Math.round(aDouble);}};System.out.println(function.apply(13.7));//lambda 写法Function<Double, Long> functionL = d -> Math.round(d);System.out.println(functionL.apply(13.4));// 方法引用Function<Double, Long> functionM = Math::round;System.out.println(functionM.apply(13.9));}
//======================================================================================================================//情况三:类 :: 实例方法(有难度)//Comparator 中的 int compare(T t1,T t2) 与 String 中的 int t1.compareTo(t2)@Testpublic void t5() {//原来的写法Comparator<String> comparator = new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}};System.out.println(comparator.compare("abc", "abd"));//lambda 写法Comparator<String> comparatorL = (o1, o2) -> o1.compareTo(o2);System.out.println(comparatorL.compare("abc", "abd"));// 方法引用Comparator<String> comparatorM = String::compareTo;System.out.println(comparatorM.compare("abd", "abc"));}//BiPredicate 中的 boolean test(T t1,T t2) 与 String 中的 boolean t1.equals(t2)@Testpublic void t6() {//原来的写法BiPredicate<String, String> biPredicate = new BiPredicate<String, String>() {@Overridepublic boolean test(String s, String s2) {return s.equals(s2);}};System.out.println(biPredicate.test("abc", "abd"));//lambda 写法BiPredicate<String, String> biPredicateL = (s1, s2) -> s1.equals(s2);System.out.println(biPredicateL.test("abc", "abd"));// 方法引用BiPredicate<String, String> biPredicateM = String::equals;System.out.println(biPredicateM.test("abc", "abd"));}//Function 中的 R apply(T t) 与 Person 中的 String getName()@Testpublic void t7() {Person person = new Person("Vincent", LocalDate.of(1991, 1, 28));//原来的写法Function<Person, String> function = new Function<Person, String>() {@Overridepublic String apply(Person person) {return person.getName();}};System.out.println(function.apply(person));//lambda 写法Function<Person, String> functionL = p -> p.getName();System.out.println(functionL.apply(person));// 方法引用Function<Person, String> functionM = Person::getName;System.out.println(functionM.apply(person));}
}

 

构造方法引用

构造方法引用又分构造方法引用和数组构造方法引用。

构造方法引用(也可以称作构造器引用)

组成语法格式:Class::new

构造函数本质上是静态方法,只是方法名字比较特殊,使用的是 new 关键字

要求:和方法引用类似,函数接口的抽象方法的形参列表和构造器的形参列表一致,且抽象方法的返回值类型即为构造器所属的类的类型。

示例:

String::new, 等价于 lambda 表达式 () -> new String()

public class ConstructorReferences {//构造器引用//Supplier 中的 T get() 与 Person()@Testpublic void t1() {//原来的写法Supplier<Person> supplier = new Supplier<Person>() {@Overridepublic Person get() {return new Person();}};System.out.println(supplier.get());//lambda的写法Supplier<Person> supplierL = () -> new Person();System.out.println(supplierL.get());//构造器引用Supplier<Person> supplierM = Person::new;System.out.println(supplierM.get());}//Function 中的 R apply(T t)@Testpublic void t2() {//原来的写法Function<String, Person> function = new Function<String, Person>() {@Overridepublic Person apply(String s) {return new Person(s);}};System.out.println(function.apply("小微"));//lambda的写法Function<String, Person> functionL = s -> new Person(s);System.out.println(functionL.apply("小微"));//构造器引用Function<String, Person> functionM = Person::new;System.out.println(functionM.apply("小微"));}//BiFunction 中的 apply(T t,U u)@Testpublic void t3() {//原来的写法BiFunction<String, LocalDate, Person> biFunction = new BiFunction<String, LocalDate, Person>() {@Overridepublic Person apply(String s, LocalDate localDate) {return new Person(s, localDate);}};Person person = biFunction.apply("威仔", LocalDate.of(2010, 12, 13));System.out.println(person);//lambda的写法BiFunction<String, LocalDate, Person> biFunctionL = (s, lD) -> new Person(s, lD);Person personL = biFunctionL.apply("威仔", LocalDate.of(2010, 12, 13));System.out.println(personL);//构造器引用BiFunction<String, LocalDate, Person> biFunctionM = Person::new;Person personM = biFunctionM.apply("威仔", LocalDate.of(2010, 12, 13));System.out.println(personM);}
}

 

数组构造方法引用

组成语法格式:TypeName[]::new

要求:可以把数组看做事一个特殊的类,则写法与构造器引用一致。

示例:

String[]::new 是一个含有一个参数的构造器引用,这个参数就是数组的长度。等价于 lambda 表达式 x -> new String[x]

public class ConstructorReferences {//数组引用//Function 中的 R apply(T t)@Testpublic void t4() {//原来的写法Function<Integer, String[]> function = new Function<Integer, String[]>() {@Overridepublic String[] apply(Integer integer) {return new String[integer];}};String[] apply = function.apply(10);System.out.println(Arrays.toString(apply));//lambda的写法Function<Integer, String[]> functionL = length -> new String[length];String[] applyL = functionL.apply(10);System.out.println(Arrays.toString(applyL));//数组引用Function<Integer, String[]> functionM = String[]::new;String[] applyM = function.apply(10);System.out.println(Arrays.toString(applyM));}
}

这篇关于方法引用与构造方法引用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026112

相关文章

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1