java函数式接口与方法引用
函数式接口指的是,一个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 这里有点像回调函数的用法,而且写法很简约。
当接口不满足函数式接口规范,比如拥有超过一个抽象方法,这样用会编译报错: