В Java, как мне создать список указателей на функции, каждый из которых принимает аргумент?
Я уже смотрел здесь, это работает для списка методов без аргументов, содержащего 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
реализовать метод accept интерфейса Consumer. Есть ли что-то, что я пропускаю здесь?
2 ответа
Я верю, что ты хочешь написать ImmutableList.of(this::bar, this::foo)
вместо ImmutableList.of((userId) -> this::bar, (userId) -> this::foo)
,
Если вы хотите использовать лямбда-выражения вместо ссылок на методы, вы должны вместо этого написать ImmutableList.of((userId) -> this.bar(userId), (userId) -> this.foo(userId))
,
Твои лямбды не правы. Вы либо предоставляете ссылку на метод, либо вы предоставляете лямбда-выражение. Вы пытаетесь неверный комбо.
Кроме того, ваши два метода 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);
}
}
}