如何在ActionListener中创建类似lambda的模式

时间:2017-06-27 22:26:35

标签: java lambda

如何从lambda编写类似这样的函数:

library(tidyverse)

tbl1 <- tibble(
  urn = c(1 ,2 ,3 ),
  a_width = c(10,20,30),
  a_height = c(12,13,14),
  b_width = c(25,50,75),
  b_height = c(25,50,75)
)

my_mean <- function(x, group) {
  width <- paste0(quo_name(group), "_width")
  height <- paste0(quo_name(group), "_height")

  summarise(x, 
  !!paste0(group, "_mean_width") := mean(!!width),          
  !!paste0(group, "_mean_height") := mean(!!height)          
  )  
}

my_mean(tbl1, "a")

# # A tibble: 1 x 2
# a_mean_width a_mean_height
# <dbl>         <dbl>
#   1           NA            NA
# Warning messages:
#   1: In mean.default("a_width") :
#   argument is not numeric or logical: returning NA
# 2: In mean.default("a_height") :
#   argument is not numeric or logical: returning NA

因为我正在创建一个库,并希望自己实现这样的模式。 在Java 8和lambda发布之前,有人会如何制作这样的模式?就像我想要接近的是:

我正在尝试将占位符设置为CustomButton ActionListener的actionPerformed方法,并调用如下方法:

jButton.addActionListener(ae -> callAnyMethod());

并且用户只需创建一个方法并将其写入砖块内...例如名为def()的方法:

CustomButton.CustomButtonListener(placeholder method (); ) 

和def将自动传递给我的CustomButtonListener的actionPerformed方法,并在点击按钮时触发

编辑:

这就是我到目前为止提出的代码:

ActionListener,它作为方法存储在我的CustomButton类中:

CustomButton.CustomButtonListener(def());

以及按钮中的代码段:

public void CustomButtonListener(Object object){

        addActionListener(new ActionListener(){

@Override
        public void actionPerformed(ActionEvent e) {



          // how to call the method stored in the Object "object" here? and actually run it?



            }
    });

3 个答案:

答案 0 :(得分:1)

您必须确定您的侦听器使用哪个URLDownloadToFile并声明匿名类。

让我们说Interface等待jButton.addActionListener(...)

ActionListener

本地使用Java 8实现的Lambdas是另一种以简单易读的方式访问方法和jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { callAnyMethod(); } }); 的方法。编译器会自动检测它应该使用的内容并调用它。

我不了解您的项目,但如果您能负担得起,学习如何使用Lambdas(和Streams)将大大提高您的工作效率,使您的代码更简单,更易读,并且更不容易出错。

答案 1 :(得分:1)

Lambda表达式是在Java 8中引入的。如果您使用的是早期的Java版本,则可以使用类和接口实现相同的模式。只需创建一个实现ActionListener接口和相应方法的类。您可以使用匿名类缩短时间。然后,您可以创建此类的实例并将其传递给addActionListener方法。或多或少,lambdas完全相同(但是,它们可能具有改进的性能)。

以下是一个例子:

public static void main() {
    ...
    MyListener myListener = new MyListener();
    jButton.addActionListener(myListener);
    ...
}

public class MyListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Triggered!");
    }
}

使用匿名类

public static void main() {
    ...
    jButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Triggered!");
        }
    });
    ...
}

答案 2 :(得分:1)

如果我没有误解您的问题,则您的语法已经正确。

public static void main() {
    ...
    jButton.addActionListener(e -> myListener());
    ...
}
...
public void myListener(){
    dosomething();
}

这是它的简写:

public static void main() {
    ...
    MyListener myListener = new MyListener();
    jButton.addActionListener(myListener);
    ...
}

public class MyListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        dosomething();
    }
}

有关更多信息,请参阅this

有关更详细的移植说明,您还可以参考 Lambda类型推断部分下的this