如何从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?
}
});
答案 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。