我有一个函数列表,所有这些函数都扩展了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> 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 )this::foo)); } public static void main(String []args) { Experiment e = new Experiment(); e.print(); } }
这打印-1
给我,所以它无法在列表中找到它.有没有办法从这个列表中提取出函数的索引?
从语言中无法保证通过评估相同方法(或构造函数)引用或相同lambda表达式得到的实例将始终相同.
您唯一的选择(关于上述方法引用)是第一次捕获对象的引用并重用它
private final ConsumerbarConsumer = this::bar; private final Consumer fooConsumer = this::foo; private final List > activities = ImmutableList.of(barConsumer, fooConsumer); public void print() { System.out.println(activities.indexOf(fooConsumer); }
虽然目前还不清楚你为什么要这样做.