Lambda表达式方法引用

1,方法引用

特殊的lambda表达式,它是对lambda表达式的一种简写方式。

在Java 8之前只能进行值传递,方法是不能传递的。如果你想调用一个方法你必须先获取到它所在的类的实例,然后再通过实例去调用这个方法,但是Java 8新增了方法引用这个新特性可以让你直接把方法当做值来传递。

若Lambda体中的内容已经存在对应的方法实现,即存在一个方法,参数列表和返回值于函数是接口一致,方法的实现内容也和Lambda体中的内容相同。则可直接使用方法引用如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。

因为函数式接口的方法参数对应于隐式方法调用时的参数,所以被引用方法签名可以通过放宽类型,装箱以及组织到参数数组中的方式对其参数进行操作,就像在调用实际方法一样.

1.1,方法引用的种类

方法引用有很多种,它们的语法如下:

  • 静态方法引用:ClassName::methodName
  • 实例上的实例方法引用:instanceReference::methodName
  • 超类上的实例方法引用:super::methodName
  • 类型上的实例方法引用:ClassName::methodName
  • 构造方法引用:Class::new。调用的构造方法是和函数式接口的参数类型一致的。
  • 数组构造方法引用:TypeName[]::new
  • 主要常用的有以下四种:

 

1.2 静态方法引用

适用于:(args)->类名.静态方法(args).  当lambda表达式中方法体,只有一条语句,而这条语句是类名.静态方法。而静态方法的参数和lambda的参数一致时。

类名::静态方法;

1.3 实例方法引用

(args) -> inst.instMethod(args)

实例方法引用,顾名思义就是调用已经存在的实例的方法,与静态方法引用不同的是类要先实例化,静态方法引用类无需实例化,直接用类名去调用

package demo09;

import java.util.function.Function;
import java.util.function.Supplier;

public class Test09 {
    public static void main(String[] args) {
        //创建一个类对象
        Student s=new Student("赵六",17);

        //通过内置的函数接口,返回对象的名称。
//        Supplier<String> supplier=()->s.getName();
        Supplier<String> supplier=s::getName;
        String s1 = supplier.get();
        System.out.println(s1);
        //观察: lambda表达式中有且仅有一条语句,方法调用调用语句。 ---实例方法引用特点: ()->对象.普通方法();
        Function<Student,String> f=(t)->t.getName();

        String apply = f.apply(s);
        System.out.println(apply); //这里就无法使用方法引用。

    }
}
class Student{
     private String name;
     private Integer age;//实体类中不能出现基本类型

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

1.4 对象方法引用

lambda: (inst,args)->inst.普通方法(args): -------->类名::普通方法

若Lambda参数列表中的第一个参数是实例方法的参数调用者,而第二个参数是实例方法的参数时,可以使用对象方法引用。

package demo09;

import java.util.function.BiFunction;


public class Test10 {
    public static void main(String[] args) {
        //判断两个字符串是否一致。
//        BiFunction<String,String,Boolean> biFunction=(t1,t2)->t1.equals(t2);
//        Boolean apply = biFunction.apply("hello", "hello");
//        System.out.println(apply);
        //观察:符合对象方法引用.----代码---进入公司---git拉取代码【看】---看懂
        BiFunction<String,String,Boolean> biFunction=String::equals;
    }
    public static void show(BiFunction<String,String,Boolean> biFunction){
        Boolean apply = biFunction.apply("hello", "hello");
        System.out.println(apply);
    }
}

1.5 构造方法引用

(args) -> new 类名(args)------构造方法引用: 类名::new

package demo09;

import java.util.function.BiFunction;
import java.util.function.Supplier;


public class Test11 {
    public static void main(String[] args) {
//        Supplier<Student> supplier=()->new Student();
//        Student student = supplier.get();
//        System.out.println(student);
        //观察:调用的构造函数.
//        Supplier<Student> supplier=Student::new;
//        Student student = supplier.get();
//        System.out.println(student);
//        BiFunction<String,Integer,Student> biFunction=(n,a)->new Student(n,a);
        BiFunction<String,Integer,Student> biFunction=Student::new;
        Student student = biFunction.apply("霍梦琪", 25);
        System.out.println(student);
    }
}

总结:

静态方法引用 类名::静态方法 lambda表达式: (参数)->类名.静态方法(参数)

实例方法引用:对象::实例方法 lambda表达式: (参数)->对象.实例方法(参数)

对象方法引用:类名::实例方法 lambda表达式: (参数1,参数2....)->参数1.实例方法(参数2..)

构造方法引用: 类名::new lambda表达式: (参数)->new 类名(参数);

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值