簡體   English   中英

具有功能接口的Java-8 lambda表達式行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM