Java Lambda表达式和事件信息

时间:2016-05-08 02:49:02

标签: java lambda event-handling event-listener

我在Java文本中有600页,并且遇到了令人困惑的事情。

在Swing编程一节中,它显示了三种不同的方法来创建“EventListener”来处理按钮点击。首先,它展示了如何在实现ActionListener的类中使用函数,然后如何使用实现ActionListener的嵌套类,以及如何使用Lambda表达式。

前两种方法使用基本相同的函数(注释是我的):

…
  button1=new JButton("foobar");             //create a button object
  button1.addActionListener(this);           //add an event handler to it
…
public void actionPerformed(ActionEvent e) { //event handler (standalone or in a class)
  if (e.getSource() == button1) {            //check if event source is the button
    //do something
  }
}

这很简单;创建一个按钮,并将按钮对象本身或包含函数的单独类传递给addActionListener,以向该按钮添加事件处理程序。

Lambda Expression使用一个看似简单相似的略微剥离的函数:

…
  button1 = new JButton("foobar");                //create a button
  button1.addActionListener(e -> button1Click()); //set button1Click as event handler
…
public void button1Click() {                      //event handler
  //do something
}

令我困惑的是缺少活动信息。在前两个方法中,函数必须检查事件源以查看它是否是按钮,但Lambda Expression只假定/知道事件源是按钮。怎么样?

它从哪里来的?对addActionListener的调用以button1开头,但在Lambda Expression中没有提及。此外,这是否意味着使用Lambda Expression限制了可用的信息?函数中没有e的引用,因此它无法访问函数来查找键,时间戳等内容。



(哦,为什么Java称之为事件 listener 而非处理程序,几乎所有其他语言都超出我的范围。他们说Java和JavaScript是相似的仅在名义上......)

2 个答案:

答案 0 :(得分:1)

请注意,传入非lambda案例的侦听器是this,即设置按钮的对象。据推测,该对象(某个控制器或容器)可能充当多个按钮的事件监听器,因此必须区分哪个发送事件。另一方面,lambda正在创建一个仅关闭单个按钮的一次性处理程序实例,因此没有歧义。

答案 1 :(得分:1)

你提到了缺乏事件信息"在lambda表达式中。 Lambda表达式中的事件信息 - 它只是没有像在另一个例子中那样被使用。

此上下文中的表达式

e -> button1Click()

的简写
(ActionEvent e) -> buttonClick()

因此您可以看到e是事件信息。

另一方面,如果缺少事件信息",你的意思是"没有使用事件信息",答案是,你是对的,这似乎是错的。这两种方法是等价的,所以要比较苹果和苹果,要么都不应该检查来源,要么两者都应该。