我需要遍历一个列表,并为每个项目在目标对象上调用不同的方法。我可以创建一个方法引用列表来做到这一点似乎很优雅,因此对于列表中的每个索引,我都可以调用与其对应的适当方法引用。

private final static List<Consumer<String>> METHODS = (List<Consumer<String>>) Arrays.asList(
     TargetClass::setValue1,
     TargetClass::setValue2,
     TargetClass::setValue3,
     TargetClass::setValue4,
     TargetClass::setValue5);

但是,Eclipse将这些错误标记为错误。此表达式的目标类型必须是功能接口(interface)。现在,TargetClass在这里是常规类,而不是接口(interface)……这是否意味着没有办法完成我在这里试图做的事情?

最佳答案

您的方法引用可能与Consumer<String>功能接口(interface)不匹配。

例如,以下代码通过了compile:

 private final static List<Consumer<String>> METHODS = Arrays.asList(
     Double::valueOf,
     Integer::valueOf,
     String::length);

由于您的方法似乎不是静态的,因此它们与Consumer<String>不匹配,因为这些方法还有一个附加的隐式参数-该方法将应用于该方法的实例。

您可以使用BiConsumer<TargetClass,String>:
private final static List<BiConsumer<TargetClass,String>> METHODS = Arrays.asList(
     TargetClass::setValue1,
     TargetClass::setValue2,
     TargetClass::setValue3,
     TargetClass::setValue4,
     TargetClass::setValue5);

10-06 03:26