在上一篇文章中,说过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. Splay代码简化版

    皆さん.こんにちは.上一篇文章,我们讲了Splay如何实现.这一篇我们来让我们的伸展树短一点. 上一篇Splay讲解的链接:リンク. 首先还是变量的定义,在这里呢,我把一些小函数也用Define来实现 ...

  2. Java实现 LeetCode 213 打家劫舍 II(二)

    213. 打家劫舍 II 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗 ...

  3. Java实现 蓝桥杯VIP 算法提高 排队打水问题

    算法提高 排队打水问题 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个人排队到r个水龙头去打水,他们装满水桶的时间t1.t2----tn为整数且各不相等,应如何安排他们的打水顺序才能使 ...

  4. Java实现 蓝桥杯VIP 算法提高 班级排名

    算法提高 班级排名 时间限制:1.0s 内存限制:256.0MB 问题描述 达达在陶陶的影响下,也对学习慢慢的产生了兴趣. 他在每次考试之后,都会追着老师问,自己在班级的总名次是多少.考试一多,老师也 ...

  5. 第九届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.哪天返回 题目描述 小明被不明势力劫持.后被扔到x星站再无问津.小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文. ...

  6. 深入剖析AQS

    目录 摘要 AbstractQueuedSynchronizer实现一把锁 ReentrantLock ReentrantLock的特点 Synchronized的基础用法 ReentrantLock ...

  7. 第一章01-正常情况下Activity的生命周期

    一.Android下能见到的界面 Window Dialog Toast Activity 二.Activity的生命周期分析 典型情况下的生命周期 ​是指在有用户参与的情况下,Activity所经过 ...

  8. mysql 双机互备份

    //1.创建用户CREATE USER 'dump'@'%' IDENTIFIED BY 'dump'; //2.开放权限GRANT ALL ON *.* TO 'dump'@'%'; //3.刷新权 ...

  9. 1.Go 开始搞起

    link 1. IDE Go Land 服务器激活 2. 资源 中文网站 翻译组 翻译组wiki 待认领文章 入门指南 中文文档 fork 更新 github 中如何定期使用项目仓库内容更新自己 fo ...

  10. 解读Spring源码之前的准备

    请忽略以下的文章,现在回过头来才发现学习源码不用如此复杂 1.IDEA 新建一个maven项目, 2.pom 中倒入 spring5 的基本包,然后利用maven 插件down下源码 3.然后就可以开 ...