Java 8 中的
方法引用
提供了一种 引用而不执行方法 的方式,并且这个特性与Lambda Expression相似,读需要兼容的函数式接口构成上下文,在执行过程中,方法引用会创建函数式接口的一个实例。请看例子:
- 静态方法的方法引用
/**
* @author junit
* 泛型函数式接口
*/
@FunctionalInterface
public interface VariableFunction<T> {
/**
* 执行一些相关操作
* @param t
* @return
*/
T someAction(T t);
}
/**
* 定义了两个方法,这两个方法都与VarialbeFunction泛型函数式接口兼容
* @author junit
*/
public class AToolClassForMethodReference {
/**
* 静态方法的方法引用Staric
* @param s
* @return
*/
public static String doSomething(String s) {
StringBuilder temp = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != ' ')
temp.append(s.charAt(i));
else
continue;
}
return temp.toString();
}
/**
* 实例方法的方法引用
* @param s
* @return
*/
public String doSomethingElse(String s) {
StringBuilder temp = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != ' ')
temp.append(s.charAt(i));
else
continue;
}
return temp.toString();
}
}
/**
* Java 8 静态方法引用
* @param var (a functional Interface)
* @param str
* @return new String
*/
public static String chageString(VariableFunction<String> var,String str){
return var.someAction(str);
}
/**
* Java8 方法引用特性(Java 8 Method Reference)
* 基本语法: ClassName::MethodName -- 提供一种引用而不执行方法的方式!!!
* 当使用ClassName.MethodName()时,被引用的方法将被执行,但是方法引用 ClassName::MethodName
* 只是获取该方法的引用,而不执行该方法,具体看程序分析
* @param args
*/
public static void main(String[] args){
//Prepare test data
String string_prepare="Java 8 Method Reference!";
String for_print;
/*
* 如何理解:
* 1:首先 ClassName::MethodName 的意义是获取一个方法的<big>引用</big>
* 而不执行该方法
*
* 2:以下这样给参数的使用方法,只是把doSomething这个方法的引用作为第一个参数,
*
* 3:为什么可以这样引用呢?因为AToolClassForMethodReference的doSomething(String s)
* 方法与函数式接口VariableFunction的someAction(String s)方法兼容!也就是
* ToolClassForMethodReference的doSomething(String s)方法为函数式接口
* VariableFunction的someAction(String s)方法提供了方法实现
*/
for_print=chageString(AToolClassForMethodReference::doSomething, string_prepare);
System.out.println("Original String:"+string_prepare);
System.out.println("String New:"+for_print);
}
}
运行结果(去掉了空格)
Original String:Java 8 Method Reference!
String New:Java8MethodReference!- 实例方法的方法引用
public class MethodReferenceDynamicClass {
/**
* Java 8 Method Reference -- 实例方法的方法引用
* ObjectReference::MethodName
* @param args
*/
public static void main(String[] args){
//创建一个实例对象
AToolClassForMethodReference toolClass=new AToolClassForMethodReference();
String string_prepare="This is another test!";
String print_string;
//通过实例引用方法
print_string=changeString(toolClass::doSomethingElse, string_prepare);
System.out.println(print_string);
}
public static String changeString(VariableFunction<String> var,String str){
return var.someAction(str);
}
}
- 运行结果(去掉了空格)
Thisisanothertest!
- 除了以上两种以外还可以有构造方法引用
//引用构造方法
classname::new
总结:
1:要理解方法引用,必须先理解
Lambda表达式
相关知识和函数式接口
相关知识以及定义