方法引用基础知识
java在java8版本中引入了方法引用。方法引用允许开发者通过它们的名字来调用一个方法或构造器。方法引用是编写lambda表达式的另一种简短方式。方法引用使用符号":: "将类/对象/构造函数与方法名称分开,有时我们会收到编译时的警告,如 "此表达式的目标类型必须是一个功能接口",所以这个错误是因为需要将方法引用或lambda表达式分配给功能接口
方法引用的语法
Classname:: methodname
Instancename:: methodname
Constructorname::new
介绍了各种类型的方法引用:
- 静态方法引用
- 实例方法引用
- 构造函数引用
静态方法引用的例子
静态方法对类来说是全局性的,它们可以直接使用Classname.staticmethod()与java8进行调用,你可以使用Classname::static-method进行调用。
public class MethodReferenceExample {
public static void main(String[] args) {
// Using lambda expression
BooleanTest lambdaExample = (n) -> PositiveNumberCheck.isPositive(n);
System.out.println(lambdaExample.test(2));
System.out.println(lambdaExample.test(-2));
// Using method reference
BooleanTest methodRefExample = PositiveNumberCheck::isPositive;
System.out.println(methodRefExample.test(2));
System.out.println(methodRefExample.test(-2));
}
}
@FunctionalInterface
interface BooleanTest {
boolean test(int n);
}
class PositiveNumberCheck {
public static boolean isPositive(int n) {
return n >= 0;
}
}
实例方法引用示例
实例方法对一个类的实例起作用。在java8之前,我们使用new class()来调用实例方法。 使用java8的方法名称,你可以调用object:: instance-method
import java.util.function.Function;
public class MethodReferenceExample {
public Integer IncrementByOne(Integer value) {
return value + 1;
}
public static void main(String[] args) {
Function function = new MethodReferenceExample()::IncrementByOne;
System.out.println(function.apply(5));
}
}
构造引用的例子
构造引用可以使用new操作符来调用。对构造的引用是通过功能接口来执行的 下面是一个构造引用的例子
import java.util.function.Consumer;
public class MethodReferenceExample {
public static void main(String[] args) {
Consumer function = Emp::new;
function.accept("Hello");
}
}
class Emp {
Emp(String msg) {
System.out.print(msg);
}
}