如何创建方法引用列表?

Ste*_*eve 4 java java-8 method-reference

我需要处理一个列表,并为每个项目调用目标对象上的不同方法.看起来很优雅,我可以创建一个方法引用列表来执行此操作,因此对于列表中的每个索引,我可以调用与其对应的适当方法引用.

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

但是,Eclipse正在使用错误标记这些错误.此表达式的目标类型必须是功能接口.现在,TargetClass这里是一个普通的类,而不是一个接口...这是否意味着没有办法完成我在这里尝试做的事情?

Era*_*ran 7

您的方法引用可能与Consumer<String>功能接口不匹配.

例如,此代码通过编译:

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

由于您的方法似乎不是静态的,因此它们不匹配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);
Run Code Online (Sandbox Code Playgroud)

  • @Steve也许您传递的方法引用与`Consumer <String>`功能接口不匹配. (2认同)
  • @Steve它的`setValue1`不是静态的,它与`Consumer <String>`不匹配.它将匹配`BiConsumer <TheClassThatContainsThatMethod,CharSequence>`. (2认同)