从函数指针列表中获取函数的索引
Getting index of a function from a List of function pointers
我有一个函数列表,所有这些函数都扩展了 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();
}
}
它为我打印了 -1
,因此无法在列表中找到它。有没有办法从这个列表中提取函数的索引?
该语言无法保证对同一方法(或构造函数)引用或同一 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);
}
虽然还不清楚你为什么想要这个。
我有一个函数列表,所有这些函数都扩展了 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();
}
}
它为我打印了 -1
,因此无法在列表中找到它。有没有办法从这个列表中提取函数的索引?
该语言无法保证对同一方法(或构造函数)引用或同一 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);
}
虽然还不清楚你为什么想要这个。