当前位置: 首页 > news >正文

方法引用和构造器引用

方法引用和构造器引用

大纲

  1. 基本介绍

具体实例

基本介绍

使用情景:
当要传递给lambda体的操作,已经有实现的方法时,就可以使用方法的引用

方法引用,本质上就是lambda表达式,而lambda表达式作为函数式接口,方法引用,也是函数式接口的实例

使用格式:
类(或对象)::方法名

方法引用的三种情况

对象::非静态方法
类::静态方法
类::非静态方法
要求接口中的抽象方法的形参列表和返回值类型与方法引用的形参列表和返回值类型相同

对象::非静态方法

package lambda;import org.junit.Test;import java.io.PrintStream;
import java.util.function.Consumer;public class cite {/*** 方法引用的使用格式:类(或对象)::方法名* 首先Consume是函数式接口* 其中的方法为 void accept(T t)* 而对于PrintStream中的 void println(T t)* 两个方法的实现可以一样,所以我直接引用PrintStream的对象的println方法**/@Testpublic void test(){// 对象 :: 非静态方法PrintStream ps = System.out;Consumer<String> con1 = ps::println;con1.accept("成功");}
}

类::静态方法

public class cite2 {@Testpublic void test(){// lambda 表达式Comparator<Integer> com1 = (t1,t2)->Integer.compare(t1,t2);// 这个传入lambda左边的参数,右边的方法体里面在调用的是其它的方法System.out.println(com1.compare(12,21));//// 方法引用(类::静态方法)Comparator<Integer> com2 = Integer::compare;// 因为这里我们要实现的比较操作和另外一个一样(Integer)System.out.println(com2.compare(12,3));}public void test1(){// 另一个 类::静态方法 的例子/*** Function 中的 R apply(T t)* Math 中的 Long round(Double d)* 那么对于Function的accept方法,就可以引用Math类的静态round方法*/// lambda表达式Function<Double,Long> func1 = d -> Math.round(d);// 方法引用 类::静态方法Function<Double,Long> func2 = Math::round;}
}

类::非静态方法

类::非静态方法
不是非常的匹配(形参列表)

  • Comparator 中的int compare(T t1,T t2);
  • String 中的int t1.compareTo(t2)
  • 对于Comparator 的compare方法,有两个参数,但是String的compareTo方法只有一个参数
  • 可以把String 的 compareTo 的调用者t1,当作compare中的t1
package lambda;import java.util.Comparator;
import java.util.function.BiPredicate;/*** 类::非静态方法* 不是特别匹配* Comparator 中的int compare(T t1,T t2);* String 中的int t1.compareTo(t2)* 对于Comparator 的compare方法,有两个参数,但是String的compareTo方法只有一个参数* 可以把String 的 compareTo 的调用者t1,当作compare中的t1*/
public class cite3 {public void  test(){// lambda 表达式Comparator<String> com1= (s1,s2)-> s1.compareTo(s2);com1.compare("abc","abd");// 方法引用Comparator<String> com2 = String::compareTo;com2.compare("sea","asd");}/*** 第二个例子* BiPredicate 中的 boolean test(T t1,T t2);* String 中的 boolean t1.equals(t2)*/public void test1(){// lambda 表达式BiPredicate<String,String> pre1 = (s1,s2) -> s1.equals(s2);// 方法引用 类::非静态方法BiPredicate<String,String> pre2 = String::equals;}
}

构造器引用

注意前面泛型的类型,就是后面形参传入的顺序

package lambda;import java.util.function.Supplier;public class constructorCite {// 构造器引用// Supplier 中的 T get()// Employee 的无参构造器:Employee()Supplier<Employee> sup = new Supplier<Employee>() {@Overridepublic Employee get() {return null;}};// lambda 表达式Supplier<Employee> sup1 = () -> new Employee();// 构造器引用Supplier<Employee> sup2 = Employee::new;
}
package lambda;import java.util.function.Function;
import java.util.function.Supplier;public class constructorCite {// Function 中的 R apply(T t)// 通过这个传入一个参数,返回其的构造的对象// lambda 表达式Function<Integer,Employee> func1 = id -> new Employee(id);// 构造器引用Function<Integer,Employee> func2 = Employee::new;
}
public class constructorCite {// BiFunction 中的 R apply(T t,U u);// 通过传入两个参数构造返回一个R的对象public void test() {// lambda 表达式BiFunction<String, Integer, Employee> func1 = (name, id) -> new Employee(name, id);BiFunction<String, Integer, Employee> func2 = Employee::new;func2.apply("wantian",1);}
}

数组引用

可以把数组看成一个特殊的类,创建数组,就是利用构造器,所以数组引用和构造器引用类似

public class arrayCite {/*** 数组引用* 可以把数组看成一个特殊的类* 数组引用类似于构造器引用*/public void test(){// lambda 表达式Function<Integer,String[]> func1 = length -> new String[length];String [] arr1 = func1.apply(5);// 数组引用Function<Integer,String[]> func2 = String[] ::new;}
}
http://www.xdnf.cn/news/31051.html

相关文章:

  • vulnhub靶场之【hacker-kid】靶机
  • 洛谷 P2606 [ZJOI2010] 排列计数
  • 第六周作业
  • 详细的PyCharm安装教程
  • STL——红黑树的封装及map/set的模拟实现
  • 重读《人件》Peopleware -(7)Ⅰ管理人力资源Ⅵ-莱特瑞尔 Laetrile
  • 【后端】【python】Python 爬虫常用的框架解析
  • 如何保存服务器mysql数据库的数据到本地文件
  • Java 并发性能优化:线程池的最佳实践
  • nohup的使用
  • MySQL中常用函数的分类及示例
  • rpcrt4!COMMON_AddressManager函数分析之和全局变量rpcrt4!AddressList的关系
  • 面向新一代扩展现实(XR)应用的物联网框架
  • 打靶日记 zico2: 1
  • Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
  • 初始 Vue
  • Android 下拉栏中的禁用摄像头和麦克风隐藏
  • PH热榜 | 2025-04-19
  • 实现Azure Databricks安全地请求企业内部API返回数据
  • linux学习 5 正则表达式及通配符
  • 聊聊Spring AI Alibaba的ElasticsearchDocumentReader
  • JavaScript中的Event事件对象详解
  • 自由学习记录(56)
  • 背包 DP 详解
  • 【mongodb】数据库操作
  • TIM_ITConfig() 和 TIM_Cmd()
  • 当HTTP遇到SQL注入:Java开发者的攻防实战手册
  • 实用电脑工具,轻松实现定时操作
  • 《目标检测双雄:YOLO与Faster R-CNN,谁主沉浮?》
  • dotnet core webapi 实现 异常处理中间件