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)

点开源码

在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
之前说,要传值给lambda体,已经有实现的方法,就可以使用方法引用,这边有自己的输出方法

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

在这里插入图片描述
因此,根据格式:

对象是 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 后才有的

在这里插入图片描述
这边

getName()  无参  ,返回类型 string

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


  • 类 : : 静态方法

比较两个数大小

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

分析 :

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

在这里插入图片描述
Integer 类 中的compare 方法 也是两个参数 ,返回值类型也是int

在这里插入图片描述
静态方法,因此:

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

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

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

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

在这里插入图片描述
在这里插入图片描述
但可以使用 方法引用

      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 抽象 方法也是无参的

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值