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

1、方法引用

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

对象引用有三种写法:

  对象::实例方法名

  类::静态方法名

  类::实例方法名

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

  1. class Student{
  2. private String name = "lcl";
  3. private Integer age = ;
  4.  
  5. public String getName() {
  6. return name;
  7. }
  8.  
  9. public Integer getAge() {
  10. return age;
  11. }
  12.  
  13. }

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

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

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

测试结果:

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

  1. @Test
  2. public void test4(){
  3.  
  4. Student student = new Student();
  5. Supplier<String> supplier = ()-> student.getName();
  6. log.info("Supplier===================={}",supplier.get());
  7.  
  8. Supplier<Integer> supplier1 = student::getAge;
  9. Integer age = supplier1.get();
  10. log.info("Supplier===================={}",age);
  11. }

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

测试结果:

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

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

测试结果:

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

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

示例代码:

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

测试结果:

2、构造器引用

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

  1. class Student{
  2. private String name = "lcl";
  3. private Integer age = ;
  4.  
  5. public String getName() {
  6. return name;
  7. }
  8.  
  9. public Integer getAge() {
  10. return age;
  11. }
  12.  
  13. public Student(String name){
  14. this.name = name;
  15. age = ;
  16. }
  17.  
  18. public Student(String name, Integer age){
  19. this.name = name;
  20. this.age = age;
  21. }
  22.  
  23. public Student(){
  24. this.name = "lcl";
  25. this.age = ;
  26. }
  27.  
  28. }

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

  1. @Test
  2. public void test2(){
  3. Supplier<Student> supplier = ()->new Student();
  4. log.info("======================{}",JSON.toJSONString(supplier.get()));
  5. Supplier<Student> supplier1 = Student::new;
  6. log.info("======================{}",JSON.toJSONString(supplier1.get()));
  7.  
  8. Function<String, Student> function = (x)->new Student(x);
  9. log.info("===================={}",JSON.toJSONString(function.apply("lcl")));
  10.  
  11. Function<String, Student> function1 = Student::new;
  12. log.info("===================={}",JSON.toJSONString(function1.apply("mm")));
  13. BiFunction<String , Integer ,Student> function2 = Student::new;
  14. log.info("===================={}",JSON.toJSONString(function2.apply("xxx",)));
  15. }

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

测试结果:

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

代码示例:

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

测试结果:

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. 【Mybatis plus 3.2】怎么操作?看看我!(update、limit、between)

    必须是springboot工程 在pom.xml中添加 <dependency> <groupId>com.baomidou</groupId> <artif ...

  2. JDBC化繁为简

    众所周知,jdbc可谓是java连接数据库最基本的方法,通过DriverManager拿到connection,再从connection拿到statement,再从statement中进一步操作得到结 ...

  3. vue 中<vue-scroll >滚动条回到顶部

    今天项目碰到一个<vue-scroll >滚动条要回到顶部的需求,查询了好久终于解决了,这里记录一下: 其实就是scrollIntoView()方法的使用(官方文档): 需要注意的是要求页 ...

  4. XStream学习手册

    ​​ 一.前言 1.XStream官网 http://x-stream.github.io 2.XStream是什么 XStream是一个简单的基于Java的类库,用来将Java对象序列化成XML(J ...

  5. Java实现 LeetCode 575 分糖果(看看是你的长度小还是我的种类少)

    575. 分糖果 给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果.你需要把这些糖果平均分给一个弟弟和一个妹妹.返回妹妹可以获得的最大糖果的种类数. 示例 1: 输入 ...

  6. 第五届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的).他注意到:书的第10页和第11页在同一张纸上,但第 ...

  7. How to delete a directory recursively in Java

    在java8或更高版本中,使用NIO API递归删除一个非空目录: try { // 创建stream流 Stream<Path> file = Files.walk(Paths.get( ...

  8. 计算从1到n中,出现某位数字的次数

    出现1-9中某位数字次数的算法 /** * @param input 整数n(1 ≤ n ≤ 1,000,000,000) * @return 1-9中某个数字在数列中出现的次数 */ public ...

  9. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  10. 常见的几种java排序算法

    一.分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅 ...