1. 程式人生 > 實用技巧 >Java8 方法引用

Java8 方法引用

方法引用

方法引用可以被看作僅僅呼叫特定方法的Lambda的一種快捷寫法。如果一個Lambda代表的只是“直接呼叫這個方法”,那最好還是用名稱來呼叫它,而不是去描述如何呼叫它。

當要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用

構建方式

  1. 類 :: 靜態方法

    Comparator<Integer>com2=Integer::compare;
    System.out.println(com2.compare(12,3));
  2. 類 :: 非靜態方法:你在引用一個物件的方法,譬如String::length,而這個物件是Lambda表示式的一個引數。舉個例子,Lambda表示式(String s) -> s.toUppeCase()可以重寫成String::toUpperCase

    Comparator<String>com1=(s1,s2)->s1.compareTo(s2);
    System.out.println(com1.compare("abc","abd"));
    System.out.println("*******************");
    Comparator<String>com2=String::compareTo;
    System.out.println(com2.compare("abd","abm"));
  3. 物件 :: 非靜態方法

    PrintStreamps=System.out;
    Consumer<String>con2=ps::println;

建構函式引用

對於一個現有建構函式,你可以利用它的名稱和關鍵字new來建立它的一個引用:ClassName::new。它的功能與指向靜態方法的引用類似。

  1. Supplier中的T get()

    Supplier<Employee>sup=()->newEmployee();
    System.out.println("*******************");

    Supplier<Employee>sup1=()->newEmployee();
    System.out.println(sup1.get());

    System.out.println("*******************"
    );

    Supplier<Employee>sup2=Employee::new;
    System.out.println(sup2.get());
  2. Function中的R apply(T t)

    Function<Integer,Employee>func1=id->newEmployee(id);
    Employeeemployee=func1.apply(1001);
    System.out.println(employee);

    System.out.println("*******************");

    Function<Integer,Employee>func2=Employee::new;
    Employeeemployee1=func2.apply(1002);
    System.out.println(employee1);
  3. BiFunction中的R apply(T t,U u)

    BiFunction<Integer,String,Employee>func1=(id,name)->newEmployee(id,name);
    System.out.println(func1.apply(1001,"Tom"));

    System.out.println("*******************");

    BiFunction<Integer,String,Employee>func2=Employee::new;
    System.out.println(func2.apply(1002,"Tom"));
  4. 陣列引用

    Function<Integer,String[]>func1=length->newString[length];
    String[]arr1=func1.apply(5);
    System.out.println(Arrays.toString(arr1));

    System.out.println("*******************");

    Function<Integer,String[]>func2=String[]::new;
    String[]arr2=func2.apply(10);
    System.out.println(Arrays.toString(arr2));