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
任何人都可以澄清一下.
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...
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |