方法引用与构造方法引用

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

相关文章

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处