Java 8 - 方法引用

1. 方法引用简介

概念

方法引用是lambda表达式的一种简化写法。

简化前提

如果lambda表达式的方法体中只调用了一个方法,并且调用的方法和函数式接口中定义的抽象方法的参数列表和返回值都一致,就可以使用方法引用进行简化。

常见形式

  1. 对象::实例方法
  2. 类::静态方法
  3. 类::实例方法
  4. 类::new

2. 方法引用的使用

package com.ali;

import javax.swing.*;
import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 方法引用的四种使用方式:
 * 1. 对象::实例方法
 * 2. 类::静态方法
 * 3. 类::实例方法
 * 4. 类::new
 */
public class Test {
    public static void main(String[] args) {
        //1.对象::实例方法
        m1();

        //2.类::静态方法
        m2();
        //3.类::实例方法
        m3();
        //4.类::new
        m4();
    }

    //1.对象::实例方法
    public static void m1() {
        //1. 对象名::实例方法
        //void accept(T t);
        //void println(String x);
        //println方法和accept方法都是有参数无返回值,可以用方法引用简化lambda的书写

        //1.1 接口 变量名 = 匿名内部类
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("consumer1");

        //1.2 接口 变量名 = lambda表达式
        consumer = s -> {
            System.out.println(s);
        };
        consumer.accept("consumer2");

        //1.3 接口 变量名 = 方法引用
        consumer = System.out::println;
        consumer.accept("consumer3");

        System.out.println("============================================");
    }

    //2.类名::静态方法
    public static void m2() {
        //public static int compare(int x, int y) 有参数有返回
        //int compare(T o1, T o2); 有参数有返回

        //匿名内部类写法
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };
        System.out.println("comparator.compare(10,20) = " + comparator.compare(10, 20));

        //用lambda表达式简化
        comparator = (o1, o2) -> {
            return Integer.compare(o1, o2);
        };
        System.out.println("comparator.compare(10,20) = " + comparator.compare(10, 20));

        //用方法引用简化
        comparator = Integer::compare;
        System.out.println("comparator.compare(10,20) = " + comparator.compare(10, 20));

        System.out.println("============================================");
    }

    //3.类::实例方法
    public static void m3() {
        //public String getName(); 无参数有返回值
        //R apply(T t); 有参数有返回值
        //比较特殊

        Person person = new Person("张三");

        //匿名内部类写法
        Function<Person, String> function = new Function<Person, String>() {
            @Override
            public String apply(Person person) {
                return person.getName();
            }
        };
        System.out.println(function.apply(person));

        //用lambda表达式简化
        function = p -> p.getName();
        System.out.println(function.apply(person));

        //用方法引用简化
        function = Person::getName;
        System.out.println(function.apply(person));

        System.out.println("============================================");
    }

    //4.类::new
    public static void m4() {
        //匿名内部类写法
        // new String(); 空参构造,返回对象
        //T get();
        Supplier<String> supplier = new Supplier<String>() {
            @Override
            public String get() {
                return new String("abc");
            }
        };
        System.out.println(supplier.get());

        //用lambda表达式简化
        supplier = () -> new String("abc");
        System.out.println(supplier.get());

        //用方法引用简化
        supplier = String::new;
        System.out.println(supplier.get());

        System.out.println("============================================");
    }
}

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

3. 参考资料

千锋教育-最新版 Java JDK8新特性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值