案例1:函數式接口作爲參數
1. 1 原日誌代碼
public class Demo01Logger {
//只有日誌等級爲1時,纔會打印日誌信息
public static void showLog(int level, String massage){
if(level==1){
System.out.println(massage);
}
}
public static void main(String[] args) {
//定義三個日誌信息
String msg1 = "hello";
String msg2 = "world";
String msg3 = "java";
showLog(1,msg1+msg2+msg3);
}
}
如代碼所示,只有當level爲1時,日誌信息纔會打印,但是當level爲其他等級的時候,儘管不需要打印,但是日誌信息已經完成拼接,此時會造成系統性能的浪費。
1.2 優化的代碼
(1)函數式接口
/**
* 函數式接口:有且只有一個抽象方法的接口,稱之爲函數式接口
* 接口中可以包含其他方法,如:默認方法、靜態方法、私有方法
*/
@FunctionalInterface //可以檢測接口是否是一個函數式接口,不滿足條件時編譯失敗
public interface messageBuilder {
public abstract String builderMessage();
}
(2)優化代碼
public class Demo02Logger {
//只有日誌等級爲1時,纔會打印日誌信息
public static void showLog(int level, messageBuilder mb){
if(level==1){
System.out.println(mb.builderMessage());
}
}
public static void main(String[] args) {
//定義三個日誌信息
String msg1 = "hello";
String msg2 = "world";
String msg3 = "java";
//messageBuilder是一個函數式接口,所以可以傳遞Lambda表達式
showLog(2,() -> {return msg1+msg2+msg3;});
/*
注意:Lambda表達式具有延遲加載的特性,當使用Lambda表達式將參數傳遞到對應的方法時,只有滿足條件的情況下,纔會對參數進行處理,不會存在性能的浪費
例如:當日志等級爲1時,纔會調用builderMessage()方法,纔會進行字符串拼接
當日志等級不爲1時,不會調用builderMessage()方法,也就不會進行字符串拼接
*/
}
}
案例2:函數式接口作爲返回值
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorDemo {
public static Comparator<String> getComparator(){
//使用匿名內部類的方式實現返回接口
/*return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();//按照字符串長度升序排列
}
};*/
//使用Lambda表達式實現
/*return (String o1, String o2)-> {
return o1.length()-o2.length();//按照字符串長度升序排列
};*/
//簡化Lambda表達式
return (o1, o2) -> o1.length()-o2.length();
}
//調用
public static void main(String[] args) {
String[] strs = {"aaa","bbbs","c","dd"};
Arrays.sort(strs,getComparator());
System.out.println(Arrays.toString(strs));
}
}