[英]Java-8 lambda expressions behaviour with functional Interface
我只是嘗試了幾個java-8函數式編程,我對lamda表達式的行為幾乎沒有懷疑。 我試圖通過簡單的命令模式來說明以下問題。
public interface Editor {
public void open();
public void close();
// public void save();
}
編輯器實施
public class MyEditor implements Editor {
@Override
public void open() {
System.out.println("...opening");
}
@Override
public void close() {
System.out.println("...closing");
}
}
界面動作
// this is actually a @FunctionalInterface
public interface Action {
public void perform();
}
可行的物品。
public class Open implements Action {
private final Editor editor;
public Open(Editor editor) {
this.editor = editor;
}
@Override
public void perform() {
editor.open();
}
// Similarly Close implements Action...
...
用於運行所有操作的宏。
public class Macro {
private final List<Action> actions;
public Macro() {
actions = new ArrayList<>();
}
public void record(Action action) {
actions.add(action);
}
public void run() {
actions.forEach(Action::perform);
}
}
現在,運行宏是交互部分所在的位置。
public class RunMacro {
public static void main(String[] args) {
Editor editor= new MyEditor();
Macro macro = new Macro();
macro.record(() -> editor.open());// Line 4
macro.record(new Close(editor)); // Line 5
macro.run();
}
}
我的問題是,在第4行的執行過程中,Java如何理解創建instanceof
並將其添加到宏中。 簡而言之,lamdba表達式的行為方式與第5行相同。使用lambda表達式,整個模式變得更加簡單但是,使用OOPS進行功能編程是否會使開發變得非常抽象或不太冗長?
問題的禮貌:O'Reilly媒體:Java 8 Lamdbas
有人可以澄清一下嗎?
Java如何理解如何創建Open的實例並將其添加到宏中?
您應該閱讀Java教程的Lambda表達式中的目標類型部分。 你寫的時候:
macro.record(() -> editor.open());
您沒有創建Open類的實例。 您沒有創建生成的匿名類的實例。
請參閱Lambda表達式的翻譯中的 Translation strategy
部分。
我們不是生成字節碼來創建實現lambda表達式的對象(例如調用內部類的構造函數),而是描述構造lambda的配方,並將實際構造委托給語言運行庫。 該配方在invokedynamic指令的靜態和動態參數列表中進行編碼。
您還可以利用java 8 方法引用 ,並再次簡化代碼:
Editor editor= new MyEditor();
Macro macro = new Macro();
macro.record(editor::open);
macro.record(editor::close);
macro.run();
最后,您可以刪除Action
界面並使用Runnable
界面。 例如,這允許使用java.util.concurrent
所有內容,例如Executor ,新的Java承諾: CompletableFuture
...
Lambda構造是Java語言中長期存在的構造: 匿名類的一種非常易讀的替代。 實際上,就技術意圖而言,您可以將lambda表達式視為一個匿名類,盡管在技術上存在很大差異。
只是為您的record
方法添加第三個變體:
macro.record(new Action() {
@Override public void perform() { editor.open(); }
});
在這里,您將一個匿名類( Action
的子類)的實例傳遞給記錄方法。 這與lambda表達式相同:
macro.record(() -> editor.open());
對於這兩個變體,您甚至不需要Open
類。 嘗試一下,將其從源中刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.