天天看點

通過方法引用簡化Lambda表達式

文章目錄

  • ​​方法引用的新特性​​
  • ​​方法引用的常用方式​​
  • ​​通過對象名引用成員方法​​
  • ​​通過類名的靜态成員方法​​
  • ​​構造器引用​​

方法引用的新特性

  • 在上篇文章​​《深入了解Java Stream流》​​結尾處,我們通過一個具體的例子展現了Stream流的應用,其中有這樣一段代碼:
public static void main(String[] args) {
        // 建立兩個班級的學生集合
        ...
        // 通過流的方式得出兩個班級的超過90分的前三名學生
        ...
      // 合并兩個流對象,并進行排序輸出
        Stream.concat(stream1, stream2).sorted((s1,s2)->s1.compareTo(s2)).forEach(student -> System.out.println(student));
       
    }
   // 學生類 
   class Student implements Comparable {
    ...
    @Override
    public int compareTo(Object o) {
        if (o instanceof Student){
            return ((Student) o).score-this.score;
        }
        return -1;
    }
}      
  • 在JDK8中引入了“方法引用“的新特性”,可以對Lambda表達式進行簡化:
Stream.concat(stream1, stream2).sorted(Student::compareTo).limit(3).forEach(student -> System.out.println(student));      

即sorted((s1,s2)->s1.compareTo(s2))簡寫成了sorted(Student::compareTo)(雙冒号::為引用運算符)。

方法引用的常用方式

使用方式 描述
對象名引用 object :: instanceMethodName
靜态方法引用 ClassName :: staticMethodName
構造器引用 ClassName :: new
通過對象名引用成員方法
  • 對象名已經存在,成員方法已經存在,則可以使用對象名來引用成員方法
/**
 * 通過對象名引用成員方法
 *
 * @author zhuhuix
 * @date 20200802
 */
public class FunctionReference01 {
    // 方法
    public static void printString(Printable printable,String s) {
        printable.print(s);
    }

    public static void main(String[] args) {
        String string = "abcdefg";
        //傳統文法
//        printString(s -> {
//            UpperCase upperCase = new UpperCase();
//            upperCase.stringUpperCase(s);
//        },string);

        // 建立字母大定轉換的對象
        UpperCase upperCase = new UpperCase();
        // 通過對象名引用成員方法實作字母大寫轉換
        printString(upperCase::stringUpperCase,string);

    }
}

// 函數式接口
@FunctionalInterface
interface Printable{
   void print(String s);
}

// 定義一個字母大寫轉換的類和大寫轉換的成員方法
class UpperCase {
    public void stringUpperCase(String s) {
        System.out.println(s.toUpperCase());
    }
}      
通過方法引用簡化Lambda表達式
通過類名的靜态成員方法
  • 類名已經存在,靜态成員方法已經存在,則可以使用類名來引用靜态成員方法
/**
 * 通過類名引用靜态成員方法
 *
 * @author zhuhuix
 * @date 20200802
 */
public class FunctionReference02 {
    // 方法
    public static void printString(Printable printable,String s) {
        printable.print(s);
    }

    public static void main(String[] args) {
        String string = "abcdefg";

        // 通過類名引用靜态成員方法實作字母大寫轉換
        printString(UpperCase::stringUpperCase,string);

    }
}

// 函數式接口
@FunctionalInterface
interface Printable{
    void print(String s);
}

// 定義一個字母大寫轉換的類和大寫轉換的成員方法
class UpperCase {
    public static void stringUpperCase(String s) {
        System.out.println(s.toUpperCase());
    }
}      
構造器引用
/**
 * 構造器引用
 *
 * @author zhuhuix
 * @date 20200802
 */
public class FunctionReference03  {
    // 方法
    public static void build(PersonBuilder personBuilder,String name,int age) {
        Person person= personBuilder.builerPerson(name,age);
        System.out.println(person.toString());
    }
    public static void main(String[] args) {
       // 構造器方法引用
       build(Person::new,"Jack",16);
       build(Person::new,"Mike",17);
       build(Person::new,"Rose",18);
    }
}

// 通過姓名與年齡建立person對象
@FunctionalInterface
interface PersonBuilder{
   Person builerPerson(String name,int age);
}

class Person{
    String name;
    int age;

    Person(){}

    Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

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