В 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);
        }
    }
}
Другие вопросы по тегам