在Java中,如何创建一个函数指针列表,每个参数都带一个参数?

时间:2015-11-20 23:07:22

标签: java function-pointers

我已经查看了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

我不明白为什么我会这样做,barfoo都会实现Consumer接口的accept方法。我有什么东西可以在这里俯瞰吗?

2 个答案:

答案 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()