java 自定义表达式_自定义 Java Lambda
用了這么久的 Java,也體驗了 Java 8 的 lambda 帶來的便捷,但是我一直都是直接用,而從未想過他是如何實現的。比如:為什么在小括號里面可以放一個函數作為參數,自己造一個lambda 應該怎么組織代碼?
開始
自定義 Lambda 表達式只需要一個接口即可,不需要編寫實現類
@FunctionalInterface
interface Greet {
void say(String toWho);
}
然后我們找個地方使用這個接口
public class LambdaApp {
public static void sayHello(String name, Greet greet) {
greet.say(name);
}
}
搞個 Main 方法測一下
public class LambdaApp {
public static void sayHello(String name, Greet greet) {
greet.say(name);
}
public static void main(String[] args) {
LambdaApp.sayHello("tqz", (x) -> {
System.out.println("Hello " + name);
});
}
}
輸出
Hello tqz
雖然沒有寫實現類,但是我們通過 lambda 傳入的 System.out.println("Hello " + name); 語句,就在編譯的時候變成了接口的實現類的語句,所以還是要一個實現接口的語句的
于是,我們可以定義更加復雜的實現方法作為參數傳給接口,附上完整代碼
/*** Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)*/
public class LambdaApp {
public static void sayHello(String name, Greet greet) {
greet.say(name);
}
// 自定義 sayHello 里面的 say 方法的實現 public static void selfSayImpl(String name) {
// 省略大段代碼。。。 System.out.println("Hello " + name);
// 省略大段代碼。。。 }
public static void main(String[] args) {
LambdaApp.sayHello("tqz", (x) -> {
LambdaApp.selfSayImpl(x);
});
}
}
@FunctionalInterface
interface Greet {
void say(String toWho);
}
原理解析
這里已經有人寫好了,我只總結一下https://blog.csdn.net/jiankunking/article/details/79825928?blog.csdn.net
總結:在原 class 里面,先搞一個 final 靜態內部類實現該接口,然后再生成一個靜態方法,方法里面的內容就是 { } 里面傳的東西。然后上面這個內部類的實現方法會調用該靜態方法。
最終原來的 ( ) -> { } 會被替換成 new 內部類( )
一句話,因為 Java 的 Lambda 是語法糖,所以編譯器會自動為你編寫實現類,實現方法!
可以看出該過程十分費勁,所以!使用 Lambda 會拖慢程序運行速度!
算法比賽千萬別用 Lambda!
總結
以上是生活随笔為你收集整理的java 自定义表达式_自定义 Java Lambda的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 防止网络慢时 表单重复提交问题
- 下一篇: Vue开发环境安装