【发布时间】:2015-05-15 12:41:13
【问题描述】:
this.addWindowListener(new WindowAdaptor(){
public void windowClosing(WindowEvent we)
{
System.exit(0);//to close the window
}
});
这是我的要求,请使用 lambda 表达式编写代码。
【问题讨论】:
标签: java lambda java-8 windowlistener
this.addWindowListener(new WindowAdaptor(){
public void windowClosing(WindowEvent we)
{
System.exit(0);//to close the window
}
});
这是我的要求,请使用 lambda 表达式编写代码。
【问题讨论】:
标签: java lambda java-8 windowlistener
lambda 表达式可以替代函数式接口(即具有单个非默认方法的接口)。因此,具有多种方法(windowActivated(WindowEvent e)、windowClosed(WindowEvent e)、windowClosing(WindowEvent e)、...)的 WindowAdapter 不能被 lambda 表达式替换。
【讨论】:
在这里你不能直接使用 lambdas,但是如果你有很多 UI 代码并且你有很多侦听器,你可以像这样创建一个构建器:
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.function.Consumer;
public class ListenerBuilder {
static final Consumer<WindowEvent> nullConsumer = e -> {};
private Consumer<WindowEvent> opened = nullConsumer;
private Consumer<WindowEvent> closing = nullConsumer;
private Consumer<WindowEvent> closed = nullConsumer;
private Consumer<WindowEvent> iconified = nullConsumer;
private Consumer<WindowEvent> deiconified = nullConsumer;
private Consumer<WindowEvent> activated = nullConsumer;
private Consumer<WindowEvent> deactivated = nullConsumer;
public ListenerBuilder opened(Consumer<WindowEvent> opened)
{ this.opened = opened; return this; }
public ListenerBuilder сlosing(Consumer<WindowEvent> closing)
{ this.closing = closing; return this; }
public ListenerBuilder closed(Consumer<WindowEvent> closed)
{ this.closed = closed; return this; }
public ListenerBuilder iconified(Consumer<WindowEvent> iconified)
{ this.iconified = iconified; return this; }
public ListenerBuilder deiconified(Consumer<WindowEvent> deiconified)
{ this.deiconified = deiconified; return this; }
public ListenerBuilder activated(Consumer<WindowEvent> activated)
{ this.activated = activated; return this; }
public ListenerBuilder deactivated(Consumer<WindowEvent> deactivated)
{ this.deactivated = deactivated; return this; }
public WindowListener build() {
return new WindowListener() {
public void windowOpened(WindowEvent e) {
opened.accept(e);
}
public void windowIconified(WindowEvent e) {
iconified.accept(e);
}
public void windowDeiconified(WindowEvent e) {
deiconified.accept(e);
}
public void windowDeactivated(WindowEvent e) {
deactivated.accept(e);
}
public void windowClosing(WindowEvent e) {
closing.accept(e);
}
public void windowClosed(WindowEvent e) {
closed.accept(e);
}
public void windowActivated(WindowEvent e) {
activated.accept(e);
}
};
}
public void attachTo(Window w) {
w.addWindowListener(build());
}
}
之后就可以这样使用了:
this.addWindowListener(new ListenerBuilder()
.opened(e -> log.info("Window is opened!"))
.closed(e -> System.exit(0)).build());
或者像这样:
new ListenerBuilder()
.opened(e -> log.info("Window is opened!"))
.closed(e -> System.exit(0)).attachTo(this);
【讨论】: