Java8實戰之方法引用與構造器引用

簡介

當要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用!(實現抽象方法的參數列表,必須與方法引用方法的參數列表保持一致!)方法引用:使用操作符:: 將方法名和對象或類的名字分隔開來。
有三種語法格式:

  • 對象::實例方法名
  • 類::靜態方法名
  • 類::實例方法名

方法引用

語法一:對象::實例方法名

// 對象::實例方法名
@Test
public void test1(){
    // 使用前
    Consumer<String> consumer1 = e -> System.out.println(e);
    consumer1.accept("aaaaaaa");

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

    // 使用後
    Consumer<String> consumer = System.out::println;
    consumer.accept("bbbbbbb");

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

    User user = new User();
    Supplier<String> supplier2 = user::getName;
    System.out.println(supplier2.get());
}

語法二:類::靜態方法名

 // 類::靜態方法名
@Test
public void test2(){
    // 使用前
    Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
    System.out.println(comparator.compare(1,2));

    // 使用後
    Comparator<Integer> comparator1 = Integer::compare;
    System.out.println(comparator1.compare(1,1));
}

語法三:類::實例方法名

// 類::實例方法名
@Test
public void test3(){
    BiPredicate<String,String> predicate = (x,y) -> x.equals(y);
    System.out.println(predicate.test("a","a"));

    BiPredicate<String,String> predicate1 = String::equals;
    System.out.println(predicate1.test("a","b"));

    BiPredicate<String,String> predicate2 = Objects::equals;
    System.out.println(predicate2.test("a","c"));
}

方法引用使用注意事項:

  • lambda體中調用方法的參數列表和返回值類型,要與函數式接口中抽象方法的函數列表和返回值類型保持一致;
  • 如果lambda參數列表中的第一個參數是實例方法的調用者,而第二個參數是實例方法的參數時,可以使用ClassName::method

構造器引用

語法格式:ClassName::method

 // 構造器引用
@Test
public void test4(){
    // 使用前
    Supplier<User> supplier = () -> new User();
    System.out.println(supplier.get());

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

    // 使用後
    Supplier<User> supplier1 = User::new;
    System.out.println(supplier1.get());


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

    Function<String, User> function = User::new;
    System.out.println(function.apply("小明"));
}

構造器引用使用注意事項:

  • 需要調用的構造器的參數列表需要與函數式接口中的抽象方法的參數列表保持一致
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章