java8 (jdk 1.8) 新特性—— 方法引用+构造器引用

1. 方法引用

方法引用 其实 本质上 就是Lambda 表达式 ,之前已经知道 Lambda 是作为一个函数式接口的实例 ,因此,方法引用也就是一个函数式接口的实例

使用的情况:

  1. 当要将值传给Lambda 体,已经有实现的方法,不用自己在lambda 体里边写多行逻辑代码

  2. 接口中抽象方法的形参列表 和 返回值类 与 方法引用 的形参列表和返回值类型 相同

但是这两种使用的情况 只 适用 对象 : : 非静态方法 和 类 : : 静态方法

要是对lambda 体 是什么,跟函数式接口不明白,可以先看看这篇篇文章,循序渐进 java8 (jdk 1.8) 新特性——Lambda及函数式接口

使用格式,很简单,总体概括 类(对象) : : 方法名

细分:

对象 : : 非静态方法 (适用)

类 : : 静态方法 (适用)

类 : : 非静态方法 ,当发现,多个参数中,有一个参数是作为方法的调用方就可以使用 【这是 这种情况的特殊体现,后面举例】

  • 对象 : : 非静态方法

举个例子:

@Test
    public void tes10() {

        Consumer<String>  consumer = str -> System.out.println(str);

        consumer.accept("坚持就是胜利");

    }

这是没有简写成方法引用的写法,先来分析一下,简单的输出语句

System.out.println(str)

点开源码

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第1张图片
java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第2张图片

println 是 PrintStream 的一个非静态方法 ,也就是说 System.out 代指 PrintStream 这个对象

     PrintStream ps  =  System.out;
        ps.println("坚持就是胜利");

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第3张图片
之前说,要传值给lambda体,已经有实现的方法,就可以使用方法引用,这边有自己的输出方法

并且, 抽象方法的形参列表跟返回值类型 与 输出的 是一样的

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第4张图片
因此,根据格式:

对象是 System.out 方法名:println 简写为

 Consumer<String>  consumer = System.out::println;
        
    consumer.accept("坚持就是胜利");

慢慢理解吧,用着用着就熟了

再来看:


  UserInfo userInfo = new UserInfo(1, "张三", 18); 
  Supplier<String>  su = () ->userInfo.getName();
  Supplier<String>  su = userInfo::getName;   

同样的对象有自己的方法

Supplier是一个 供给型的函数式接口,也是java8 后才有的

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第5张图片
这边

getName()  无参  ,返回类型 string

 get()  无参  ,返回类型 string [泛型 T 但是我申明的是接收String ]


  • 类 : : 静态方法

比较两个数大小

Comparator<Integer> con  = (x,y) ->Integer.compare(x,y);
        con.compare(6,8);

分析 :

Comparator 中的 compare 有两个参数, 返回类型为 int

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第6张图片
Integer 类 中的compare 方法 也是两个参数 ,返回值类型也是int

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第7张图片
静态方法,因此:

  Comparator<Integer> con  = Integer::compare;
        con.compare(6,8);
  • 类 : : 非静态方法

还是比较两个数大小,这次使用compareTo ,一个非静态方法

 Comparator<Integer> con  = (t1,t2)->t1.compareTo(t2);
        con.compare(6,8);

可以看到这边参数t1是作为一个调用者,虽然他们参数不同

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第8张图片
java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第9张图片
但可以使用 方法引用

      Comparator<Integer> con  = Integer::compareTo;
        con.compare(6,8);

2 . 构造器引用

构造器引用其实跟方法引用没什么差,八九不离十,只不过是换成了使用构造器

package com.test1.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * @author Administrator
 */
@ToString
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {

    private Integer id;
    private String name;
    private Integer age;



}


无参构造才可以

   Supplier<UserInfo> supplier = () -> new UserInfo();
   
   Supplier<UserInfo> supplier = UserInfo::new;

因为 Supplier 的get 抽象 方法也是无参的

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用_第10张图片

你可能感兴趣的:(jdk1.8,新特性,java,开发语言,jdk1.8,方法引用,构造器引用)