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新特性

猜你喜欢

转载自blog.csdn.net/ZHHX666/article/details/124746129