具有功能接口的Java-8 lambda表达式行为

cha*_*uru 2 java lambda functional-programming java-8

我只是尝试了几个java-8函数式编程,我对lamda表达式的行为几乎没有怀疑.我试图用简单的命令模式解释下面的问题.

public interface Editor {
    public void open();
    public void close();
//  public void save();

}
Run Code Online (Sandbox Code Playgroud)

编辑实施

public class MyEditor implements Editor {

    @Override
    public void open() {
        System.out.println("...opening");

    }

    @Override
    public void close() {
        System.out.println("...closing");
    }

}
Run Code Online (Sandbox Code Playgroud)

界面动作

// this is actually a @FunctionalInterface
public interface Action {
    public void perform();

}
Run Code Online (Sandbox Code Playgroud)

可行的物品.

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...
Run Code Online (Sandbox Code Playgroud)

...

用于运行所有操作的宏.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在运行宏是interesing部分的位置.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在第4行的执行过程中,Java如何理解创建instanceofOpen并将其添加到宏中.简而言之,lamdba表达式的行为与第5行相同.使用lambda表达式,整个模式变得更简单.使用OOPS进行函数式编程是否使得开发处于非常抽象的级别或更简洁?

礼貌问题:O'Reilly Media:Java 8 Lamdbas

任何人都可以澄清一下.

gon*_*ard 7

Java如何理解创建Openof实例并将其添加到宏中?

你应该阅读部分目标打字Lambda表达式中的Java教程.你写的时候:

macro.record(() -> editor.open());
Run Code Online (Sandbox Code Playgroud)

您没有创建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();
Run Code Online (Sandbox Code Playgroud)

最后你可以删除Action界面并使用Runnable它.这允许例如使用java.util.concurrent类似Executor的所有东西,新的java承诺:CompletableFuture...

  • 完全披露:我是Java 8 Lambdas的作者.我赞成这个答案而不是添加我自己的答案,因为我认为这是一个非常好的答案!如果您想更详细地了解Target Typing,那么可能值得阅读从第11页开始的名为"Type Inference"的部分. (4认同)