**
方法引用
**
方法引用优化Lambda表达式,如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么可以通过双冒号来引用该方法作为Lambda表达式的替代者。
这样可能比较抽象,我们直接看一个例子
我们先定义一个函数式接口
@FunctionalInterface
public interface Myinterface {
public void print(String s);
}
一个方法,函数式接口作为参数
public static void printSome(Myinterface mi) {
mi.print("Hello");
}
写这两个的原因是我们要使用Lambda表达式,下面使用方法引用
public static void main(String[] args) {
printSome(System.out::println);//方法引用
}
结果
Hello
这个结果可能不出乎我们的意料,但是为什么可以这样用呢?
前面说过,方法引用简化了Lambda表达式,而printSome方法的括号里面本来就是要传递一个Lambda表达式的,而这个Lambda表达式要表达的函数方案(打印Hello)已经存在于某个方法(printSome)的实现中,所以我们可以通过双冒号来引用该方法作为Lambda表达式的替代者。
在介绍方法引用的一些常用的用法之前,先定义一个类和一个函数式接口(为了演示用的)
类
public class MyClass {
private String name;
MyClass()
{
}
MyClass(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void toUpperCase(String str)
{
System.out.println(str.toUpperCase());
}
public static void toLowerCase(String str)
{
System.out.println(str.toLowerCase());
}
}
函数式接口
@FunctionalInterface
public interface MyInterface2 {
public MyClass builder(String s);
}
下面介绍一下方法引用的一些常用的用法:
1.通过对象名引用成员方法
public static void main(String[] args) {
/*
对象已经存在(mc)
成员方法已经存在(toUpperCase)
引用号(::)
*/
MyClass mc=new MyClass();
printSome(mc::toUpperCase);
}
结果
HELLO
2.通过类名引用静态成员方法
public static void main(String[] args) {
/*
类已经存在(MyClass)
静态成员方法已经存在(toLowerCase)
引用号(::)
*/
MyClass mc=new MyClass();
printSome(MyClass::toLowerCase);
}
结果
hello
3.通过类名调用构造方法
public static void main(String[] args) {
/*
类名(MyClass)
构造方法(new)
引用号(::)
*/
String name=printName(MyClass::new);
System.out.println(name);
}
public static String printName(MyInterface2 mi2){
return new MyClass("gfx").getName();
}
结果
gfx