Men*_*los 79 java lambda anonymous-class java-8
我正在阅读以下新功能:http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html
我看到了下面的例子:
使用匿名类:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Action Detected");
}
});
Run Code Online (Sandbox Code Playgroud)
使用Lambda:
button.addActionListener(e -> {
System.out.println("Action Detected");
});
Run Code Online (Sandbox Code Playgroud)
MouseListener如果他们想在匿名类中实现多个方法,有人会做什么,例如:
public void mousePressed(MouseEvent e) {
saySomething("Mouse pressed; # of clicks: "
+ e.getClickCount(), e);
}
public void mouseReleased(MouseEvent e) {
saySomething("Mouse released; # of clicks: "
+ e.getClickCount(), e);
}
Run Code Online (Sandbox Code Playgroud)
... 等等?
Rei*_*eus 87
来自JLS 9.8
功能接口是只有一个抽象方法的接口,因此代表单个函数契约.
Lambdas需要这些功能接口,因此仅限于其单一方法.匿名接口仍然需要用于实现多方法接口.
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
...
}
@Override
public void mousePressed(MouseEvent e) {
...
}
});
Run Code Online (Sandbox Code Playgroud)
Hol*_*ger 76
您可以使用辅助接口将多方法接口与lambdas一起使用.这适用于这样的监听器接口,其中不需要的方法的实现是微不足道的(即我们也可以做什么MouseAdapter提供):
// note the absence of mouseClicked…
interface ClickedListener extends MouseListener
{
@Override
public default void mouseEntered(MouseEvent e) {}
@Override
public default void mouseExited(MouseEvent e) {}
@Override
public default void mousePressed(MouseEvent e) {}
@Override
public default void mouseReleased(MouseEvent e) {}
}
Run Code Online (Sandbox Code Playgroud)
您只需要定义一次这样的辅助接口.
现在,你可以为这样的点击事件添加一个监听器Component c:
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
Run Code Online (Sandbox Code Playgroud)
Bri*_*etz 31
Lambda EG确实考虑过这个问题.许多库使用功能接口,即使它们是在功能接口成为事物之前的几年设计的.但有时会发生一个类有多个抽象方法,而你只想用lambda来定位其中一个.
这里官方推荐的模式是定义工厂方法:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
Run Code Online (Sandbox Code Playgroud)
这些可以直接由API本身完成(这些可以是其中的静态方法MouseListener),或者如果维护者选择不提供这种便利,则可以是其他库中的外部辅助方法.因为需要这种情况的情况很少,并且解决方法非常简单,所以扩展语言以挽救这个角落的情况似乎并不引人注目.
采用了类似的技巧ThreadLocal; 看到新的静态工厂方法withInitial(Supplier<S>).
(顺便说一下,当这个问题出现时,这个例子几乎总是如此MouseListener,这是令人鼓舞的,因为它表明那些希望对lambda友好的类,但实际上并不是很小.)
| 归档时间: |
|
| 查看次数: |
50440 次 |
| 最近记录: |