Java基础——方法引用

方法引用(Method References)是一种语法糖,它本质上就是 Lambda 表达式,我们知道Lambda表达式是函数式接口的实例,所以说方法引用也是函数式接口的实例。

Tips:什么是语法糖?语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
可以将语法糖理解为汉语中的成语,用更简练的文字表达较复杂的含义。在得到广泛接受的情况下,可以提升交流的效率。

语法

方法引用使用一对冒号(::)来引用方法,格式如下:

类或对象 :: 方法名

eg

public class ConsumerMethodReference {
    public static void main(String[] args) {
        Consumer<String> c = s -> System.out.println(s);
        c.accept("Hello World");

        Consumer<String> consumer = System.out::println;
        consumer.accept("Hello World");
    }
}

其中System.out就是PrintStream类的对象,println就是方法名。

方法引用的分类

方法引用的使用,通常可以分为以下 4 种情况:

  1. 对象 :: 非静态方法:对象引用非静态方法,即实例方法;
  2. 类 :: 静态方法:类引用静态方法;
  3. 类 :: 非静态方法:类引用非静态方法;
  4. 类 :: new:构造方法引用。

对象引用实例方法

public class ConsumerMethodReference {
    public static void main(String[] args) {
        
        Consumer<String> consumer = System.out::println;
        consumer.accept("Hello World");
        
    }
}

类引用静态方法

public class ComparatorMethodReference {
    public static void main(String[] args) {
        // Lambda 表达式
        Comparator<Integer> l = (t1, t2) -> Integer.compare(t1, t2);
        System.out.println(l.compare(1, 2));

        // 类 :: 静态方法( compare() 为静态方法)
        Comparator<Integer> m = Integer::compare;
        System.out.println(m.compare(3, 2));
    }
}

类引用实例方法

类引用构造方法

class Student {
    private String name;

    public Student() {
        System.out.println("Student无参数构造方法");
    }

    public Student(String name) {
        System.out.println("Student单参数构造方法");
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

}

public class StructMethodReference {
    public static void main(String[] args) {
        // 使用 Lambda 表达式,调用无参构造方法
        Supplier<Student> a = () -> new Student();
        a.get();

        // 使用方法引用,引用无参构造方法
        Supplier<Student> b = Student::new;
        b.get();

        // 使用 Lambda 表达式,调用单参构造方法
        Function<String, Student> c = name -> new Student(name);
        Student s1 = c.apply("c");
        System.out.println(s1.getName());
        
        // 使用方法引用,引用单参构造方法
        Function<String, Student> d = Student::new;
        Student s2 = d.apply("d");
        System.out.println(s2.getName());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值