在 Java 中,如何创建一个函数指针列表,每个指针都有一个参数?
In Java, how do I create a List of function pointers which take an argument each?
我已经看过 here,它适用于包含 Runnable 的无参数方法列表。在我的情况下,我需要 Consumer
。这是我目前所拥有的:
import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.function.Consumer;
public class experiment {
private static List<Consumer<String>> activities;
public experiment (){
activities = ImmutableList.of(
(userId) -> this::bar, // throws error
(userId) -> this::foo);
}
public void bar(String x) {
System.out.println(x);
}
public void foo(String x) {
System.out.println(x);
}
public static void main(String []args) {
for (int i=0; i<2; i++) {
activities.get(i).accept("activity #" + i);
}
}
}
我看到的错误是 void is not a functional interface
。
我不明白为什么会这样,bar
和 foo
都实现了 Consumer 接口的 accept 方法。我在这里忽略了什么吗?
我相信你想写 ImmutableList.of(this::bar, this::foo)
而不是 ImmutableList.of((userId) -> this::bar, (userId) -> this::foo)
。
如果您确实想使用 lambda 表达式而不是方法引用,则应该改为 ImmutableList.of((userId) -> this.bar(userId), (userId) -> this.foo(userId))
.
你的 lambda 是错误的。您可以提供一个方法参考, 或 您提供一个 lambda 表达式。您尝试的组合不正确。
另外,你的foo()
和bar()
两个方法应该是static
,你的实例变量不应该是。为了展示如何调用实例方法,我添加了 baz()
和 qux()
.
完整示例如下:
public class Experiment {
private List<Consumer<String>> activities;
public Experiment() {
this.activities = ImmutableList.of(
(userId) -> Experiment.bar(userId),
Experiment::foo,
(userId) -> this.baz(userId),
this::qux
);
}
public static void bar(String x) {
System.out.println(x);
}
public static void foo(String x) {
System.out.println(x);
}
public void baz(String x) {
System.out.println(this.hashCode() + ": " + x);
}
public void qux(String x) {
System.out.println(this.hashCode() + ": " + x);
}
public static void main(String[] args) {
Experiment ex = new Experiment();
for (int i = 0; i < ex.activities.size(); i++) {
ex.activities.get(i).accept("activity #" + i);
}
}
}
我已经看过 here,它适用于包含 Runnable 的无参数方法列表。在我的情况下,我需要 Consumer
。这是我目前所拥有的:
import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.function.Consumer;
public class experiment {
private static List<Consumer<String>> activities;
public experiment (){
activities = ImmutableList.of(
(userId) -> this::bar, // throws error
(userId) -> this::foo);
}
public void bar(String x) {
System.out.println(x);
}
public void foo(String x) {
System.out.println(x);
}
public static void main(String []args) {
for (int i=0; i<2; i++) {
activities.get(i).accept("activity #" + i);
}
}
}
我看到的错误是 void is not a functional interface
。
我不明白为什么会这样,bar
和 foo
都实现了 Consumer 接口的 accept 方法。我在这里忽略了什么吗?
我相信你想写 ImmutableList.of(this::bar, this::foo)
而不是 ImmutableList.of((userId) -> this::bar, (userId) -> this::foo)
。
如果您确实想使用 lambda 表达式而不是方法引用,则应该改为 ImmutableList.of((userId) -> this.bar(userId), (userId) -> this.foo(userId))
.
你的 lambda 是错误的。您可以提供一个方法参考, 或 您提供一个 lambda 表达式。您尝试的组合不正确。
另外,你的foo()
和bar()
两个方法应该是static
,你的实例变量不应该是。为了展示如何调用实例方法,我添加了 baz()
和 qux()
.
完整示例如下:
public class Experiment {
private List<Consumer<String>> activities;
public Experiment() {
this.activities = ImmutableList.of(
(userId) -> Experiment.bar(userId),
Experiment::foo,
(userId) -> this.baz(userId),
this::qux
);
}
public static void bar(String x) {
System.out.println(x);
}
public static void foo(String x) {
System.out.println(x);
}
public void baz(String x) {
System.out.println(this.hashCode() + ": " + x);
}
public void qux(String x) {
System.out.println(this.hashCode() + ": " + x);
}
public static void main(String[] args) {
Experiment ex = new Experiment();
for (int i = 0; i < ex.activities.size(); i++) {
ex.activities.get(i).accept("activity #" + i);
}
}
}