在上一篇文章中,说过JDK8中内置的函数时接口,为了方便使用,JDK8还提供了方法引用和构造器引用,来简化lambda的写法

1、方法引用

方法引用说明:lambda表达式中的方法已经在其他方法中已经有实现,可以直接使用双冒号进行方法引用,引用的前提是使用的出入参和引用方法的出入参必须一致

对象引用有三种写法:

  对象::实例方法名

  类::静态方法名

  类::实例方法名

再写代码示例前,先新增一个Student的内部类,以供后面演示使用

class Student{
private String name = "lcl";
private Integer age = ; public String getName() {
return name;
} public Integer getAge() {
return age;
} }

(1)首先说第一种,对象::实例方法名

@Test
public void test1(){
//方法引用,lambda表达式中的方法已经在其他方法中已经有实现,可以直接使用双冒号进行方法引用,引用的前提是使用的出入参和引用方法的出入参必须一致
//对象::实例方法名
PrintStream ps = System.out;
Consumer<String> consumer = (x)->ps.println(x);
consumer.accept("000000000000000000000"); PrintStream ps1 = System.out;
Consumer<String> consumer1 = ps1::println;
consumer1.accept("111111111111111111111"); Consumer<String> consumer2 = System.out::println;
consumer2.accept("2222222222222222222222"); }

上述代码中,第一种实现,就是使用原来说的lambda的写法,因为在PrintStream对象中,已经有println方法的实现,并且println方法的出入参(入参可以是String,出参为空)符合消费型接口Consumer的出入参,因此可以直接使用方法引用返回Consumer。

测试结果:

同样,我们可以使用自己创建的类,只要方法的出入参符合函数时接口的出入参即可,这里拿上面创建的Student对象的getName和getAge方法演示

    @Test
public void test4(){ Student student = new Student();
Supplier<String> supplier = ()-> student.getName();
log.info("Supplier===================={}",supplier.get()); Supplier<Integer> supplier1 = student::getAge;
Integer age = supplier1.get();
log.info("Supplier===================={}",age);
}

由于getAge和getName方法的出入参都符合Suppiler的出入参(无入参,有出参),因此可以使用Suppiler进行处理

测试结果:

(2)然后再说第二种实现方式    类::静态方法名

    @Test
public void test5(){
//类::静态方法名
Comparator<Integer> comparator = Integer::compare;
log.info("=================={}",comparator.compare(,));
}

测试结果:

(3)最后说第三种实现方式      类::实例方法名

使用该种方法,有条件限制:第一个入参是调用该方法的调用者,第二个参数是方法引用的入参时,可以使用类的实例方法调用

示例代码:

    @Test
public void test6(){
//类::实例方法名
//条件限制:第一个入参是调用该方法的调用者,第二个参数是方法引用的入参时,可以使用类的实例方法调用
BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);
log.info("=========================={}",biPredicate.test("","")); BiPredicate<String, String> biPredicate1 = String::equals;
log.info("=========================={}",biPredicate.test("","")); }

测试结果:

2、构造器引用

首先为Student创建三个构造器,分别是无参构造器,一个参数的构造器和两个参数的构造器

class Student{
private String name = "lcl";
private Integer age = ; public String getName() {
return name;
} public Integer getAge() {
return age;
} public Student(String name){
this.name = name;
age = ;
} public Student(String name, Integer age){
this.name = name;
this.age = age;
} public Student(){
this.name = "lcl";
this.age = ;
} }

然后,演示构造器引用的使用方法:

    @Test
public void test2(){
Supplier<Student> supplier = ()->new Student();
log.info("======================{}",JSON.toJSONString(supplier.get()));
Supplier<Student> supplier1 = Student::new;
log.info("======================{}",JSON.toJSONString(supplier1.get())); Function<String, Student> function = (x)->new Student(x);
log.info("===================={}",JSON.toJSONString(function.apply("lcl"))); Function<String, Student> function1 = Student::new;
log.info("===================={}",JSON.toJSONString(function1.apply("mm")));
BiFunction<String , Integer ,Student> function2 = Student::new;
log.info("===================={}",JSON.toJSONString(function2.apply("xxx",)));
}

代码分为三组,分别演示对于无参构造器,一个参数的构造器和两个参数的构造器的引用,可以发现,引用的写法一摸一样,具体调用的是哪个构造器,则根据函数式接口的参数而定。

测试结果:

4、除了方法引用和构造器引用外,JDK8还提供了数组引用,其实也相当于是构造器引用

代码示例:

    @Test
public void test3(){
//数组引用
Function<Integer,String[]> function = (x)-> new String[x];
log.info("===================={}",function.apply().length); Function<Integer,String[]> function1 = String[]::new;
log.info("===================={}",function1.apply().length);
}

测试结果:

JDK8--05:方法引用和构造器引用的更多相关文章

  1. java8新特性——方法引用与构造器引用

    上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...

  2. JDK8新特性04 方法引用与构造器引用

    import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /** * 一.方法引用 * ...

  3. JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用

    一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...

  4. Java8新特性 -- Lambda 方法引用和构造器引用

    一. 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用” 要求 方法的参数和返回值类型 和 函数式接口中的参数类型和返回值类型保持一致. 主要有三种语法格式: 对象 :: ...

  5. Java8 方法引用与构造器引用,数组引用

    package java_8; import org.junit.Test; import java.io.PrintStream; import java.util.Comparator; impo ...

  6. Java8新特性 - 方法引用与构造器引用

    方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...

  7. Java8新特性(三)之方法引用和构造器引用

    1.使用场景 当要传递给Lambda体的操作,已经存在实现的方法了,就可以使用方法引用.(抽象方法的参数列表  必须与方法引用方法的参数列表保持一致) 2. 语法 使用操作符[::]将方法名和对象或类 ...

  8. 方法引用(Method reference)和构造器引用(construct reference)

    Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用 方法引用语法格式有以下三种: objectName::instanceMethod ClassName::staticMethod C ...

  9. Lambda 方法引用 构造器引用 数组引用

    一.方法引用 注意: 1.Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中的抽象方法的函数列表和返回值保持一致!2.若Lambda 参数列表中的第一个参数是实例方法的调用者,而第二个 ...

随机推荐

  1. 最好用的FTP工具,最好用的FTP工具推荐!

    IIS7服务器管理工具是一个良好的FTP的客户端,可以进行FTP的操作!同时,还可以作为VNC的客户端进行VNC的相关操作!它还能连接Windows和Linux的服务器和PC,并对他们的连接状态进行实 ...

  2. Alpha冲刺 —— 5.5

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...

  3. (Java实现) 装载问题

    2.装载问题 [问题描述] 有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi.找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船. [ ...

  4. Java实现 蓝桥杯VIP 算法训练 FBI树

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  5. Java实现 LeetCode 189 旋转数组

    189. 旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] ...

  6. Java实现 LeetCode 102 二叉树的层次遍历

    102. 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 2 ...

  7. Java中StringBuffer类的常用方法

    StringBuffer:StringBuffer类型 描述:在实际应用中,经常回遇到对字符串进行动态修改.这时候,String类的功能受到限制,而StringBuffer类可以完成字符串的动态添加. ...

  8. 第三届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.数量周期 [结果填空](满分9分) 复杂现象背后的推动力,可能是极其简单的原理.科学的目标之一就是发现纷繁复杂的自然现象背后的简单法则 ...

  9. java实现数字的值返回

    以下的静态方法实现了:把串 s 中第一个出现的数字的值返回. 如果找不到数字,返回-1 例如: s = "abc24us43" 则返回 2 s = "82445adb5& ...

  10. CUDA优化

    cuda程序优化 一:程序优化概述 1:精度 在关键步骤使用双精度,其他步骤使用单精度,以获得指令吞吐量和精度的平衡. 2:延迟 先缓冲一定量数据,在交给GPU计算.可以获得较高的数据吞吐量. 3:计 ...