003 方法引用
一.方法的分析
首先我们看下面的一个例子:
public class MethodRefrence {
static class Inner {
public void exec(Inner this) {
System.out.println("exec.....");
}
public static void staticExec() {
System.out.println("static ... exec");
}
}
@Test
public void test1() {
Inner inner = new Inner();
inner.exec();
}
}
在上面的代码之中,最为奇怪的就是我们的一个实例方法之中的第一个参数是this.
其实这个this就是实例方法和静态方法最大区别了,一个实例方法之中,在编译的时候,会自动传入一个this的参数,参数的类型就是本类的类型.
再了解了上述的事实之后,我们来看一下方法的引用.
二 方法引用
如果我们抽象了一个方法之后,我们发现这个方法本身就是一个lambda表达式.
因为它的基本结构就是参数列表和返回值,其中的方法体对应了lambda之中的代码体.
我们知道一个方法在java之中答题可以分成下面的三种:
[1]静态方法
[2]实例方法
[3]构造方法
在下面我们来分别看上述的三种方法的方法引用的使用.
三. 静态方法的引用
public class StaticClass {
public static void exec() {
System.out.println("static method ....");
}
public static void main(String[] args) {
Runnable run = StaticClass::exec;
run.run();
}
}
在上面的代码之中,我们最关注的就是 '::' 这个符号,这个符号出现在java8之中,代表的就是一个方法引用,其实方法引用也是一个lambda.
还记得之前我们写过类似的代码吗?
从这里我们看到,一个函数之中,我们最为关注的就是参数列表和返回值,方法体就是逻辑单元.
这样的结构就是lambda的基本形式.
在这里我们展示的就是静态方法引用,基本的结构就是------> 类名 :: 静态方法名.
四 .实例方法
首先我们看下面的例子 :
public class StaticClass {
public void instanceMethod() {
System.out.println("instance method ....");
}
public static void main(String[] args) {
StaticClass instance = new StaticClass();
Runnable run = instance::instanceMethod;
}
}
我们看到实例方法和静态方法引用的区别仅仅就是我们使用实例对象进行方法引用了.
现在看下面的代码:
//我们使用一个Function直接方法引用returnLength
Function<String,Integer> func = String::length;
Integer length = func.apply("trek");
System.out.println(length);
我们发现我们使用类名引用了一个实例方法,但是我们需要注意的就是我们返回的函数式接口的入参到底是什么?
没错,实例方法仅仅就是在入参添加了一个this而已.
五 . 构造方法引用
我们知道构造函数其实和普通的函数的区别仅仅在于构造函数的返回值.
构造方法没有返回值,但是实际上在使用new 关键词的时候回返回一个对象.
首先我们看下面的一个例子:
Supplier<StaticClass> supplier = StaticClass::new;
supplier.get().instanceMethod();
上面展示的是一个无参构造函数的情况,现在我们展示一下有参构造函数的情况.
Function<String, StaticClass> func = StaticClass :: new;
func.apply("trek").instanceMethod();
在这里我们看到我们我们使用相同的语法,却创建了不同的对象,这完全依赖于 java8之中的参数推导的功能.