从函数指针列表中获取函数的索引

Sid*_*tha 2 java java-8 method-reference

我有一个函数列表,所有这些函数都扩展了Consumer接口.我需要提取出函数的索引.这样做的原因是我正在实现循环工作流,其中用户按顺序调用列表中的函数.因此,当用户使用foo完成时,foo调用一个调度程序函数,该函数在列表中的foo之后调度该函数.为此,foo需要知道列表中自己的索引.我不想硬编码数字,这就是我试图检索foo索引的原因.这就是我所拥有的:

import com.google.common.collect.ImmutableList;

import java.util.List;
import java.util.function.Consumer;

public class Experiment {

  private List<Consumer<String>> activities = ImmutableList.of(
  this::bar,
  this::foo
  );

  public void bar(String x) {
    System.out.println();
  }

  public void foo(String x) {
    System.out.println();
  }

  public void print() {
    System.out.println(activities.indexOf((Consumer<String>)this::foo));
  }

  public static void main(String []args) {
    Experiment e = new Experiment();
    e.print();
  }
}
Run Code Online (Sandbox Code Playgroud)

这打印-1给我,所以它无法在列表中找到它.有没有办法从这个列表中提取出函数的索引?

Sot*_*lis 5

从语言中无法保证通过评估相同方法(或构造函数)引用或相同lambda表达式得到的实例将始终相同.

您唯一的选择(关于上述方法引用)是第一次捕获对象的引用并重用它

private final Consumer<String> barConsumer = this::bar;
private final Consumer<String> fooConsumer = this::foo;
private final List<Consumer<String>> activities = ImmutableList.of(barConsumer, fooConsumer);

public void print() {
    System.out.println(activities.indexOf(fooConsumer);
}  
Run Code Online (Sandbox Code Playgroud)

虽然目前还不清楚你为什么要这样做.