我已经查看了here,这适用于包含Runnables的参数较少的方法列表。我需要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方法。我有什么东西可以在这里俯瞰吗?
答案 0 :(得分:6)
我相信你想写ImmutableList.of(this::bar, this::foo)
而不是ImmutableList.of((userId) -> this::bar, (userId) -> this::foo)
。
如果你想使用lambdas而不是方法引用,你应该写ImmutableList.of((userId) -> this.bar(userId), (userId) -> this.foo(userId))
。
答案 1 :(得分:0)
你的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);
}
}
}
。
以下是完整示例:
import pydb
pydb.debugger()