函數式接口指的是,一個interface, 只含有一個抽象方法。函數式接口可以加上@FunctionalInterface注解,加上這個注解后編譯器會檢查接口是否滿足函數式接口的規范,不滿足規范則直接編譯不過。?
典型的內置函數式接口有Runnable?、Consumer、Supplier、Function、Predicate。 也可以自定義函數式接口。函數式接口可以和方法引用配合起來使用。 使用方法引用,需要該方法的參數、返回值能和接口的抽象方法的參數、返回值對應起來。
這里拿Runnable?接口為例寫幾個測試代碼看怎么用的。代碼如下:
// class MyClass中的代碼static void test2() {// Runnable只含有一個抽象方法run,run方法沒有參數,沒有返回值。Runnable runnable = () -> { // lambda表達式System.out.println("haha");};runnable.run();runnable = MyClass::sayHeiHei; // 靜態方法引用。sayHeiHei方法和Runnable接口的run方法的方法簽名一樣,所以可以這樣賦值。runnable.run();runnable = new MyClass()::sayHeHe; // 對象的實例方法引用runnable.run();
}static void sayHeiHei() {System.out.println("嘿嘿");
}void sayHeHe() {System.out.println("呵呵");
}
打印如下:
ok
再寫一段測試方法:
// // class MyClass中的代碼public static void main(String[] args) {invokeCallBack(new MyClass()::getName);
}String getName() {return "滅絕師太";
}static void invokeCallBack(Callable<String> call) {try{System.out.println(call.call());} catch (Exception e) {}
}
打印:
ok 這里有點像回調函數的用法,而且寫法很簡約。
當接口不滿足函數式接口規范,比如擁有超過一個抽象方法,這樣用會編譯報錯: