Java:将带有参数的非 void 方法作为另一个方法的参数传递



我正在努力解决一个小的java技巧,即:如何将一个带有一个参数的非void方法传递为另一个方法的参数(或两个(? 我想这将涉及功能或Biconsumer,我一直在尝试它。但我没有设法让它工作... 确切的上下文非常简单:我正在使用 Quickfixj 库处理修复消息,我需要调用类消息:

  • getInt(int tagValue( 返回一个 int,
  • getString(int tagValue( 返回一个字符串,
  • getChar(int tagValue( 返回一个 char。

我一直在尝试这个:

public static < T > void setFieldsMap(int fieldTag,
Function< Integer, T > messageGetter,
String fieldKey ) throws FieldNotFound {
this.fieldsMap.put( fieldKey, String.valueOf( messageGetter.apply( fieldTag ) ) );
}

我想这样称呼:

setFieldsMap( myTag, message::getString, "MY_KEY" );

但这不能编译。我收到以下错误:"int 不是功能接口"。

当然,我已经检查了谷歌,但它没有给我一个合适的解决方案。我只找到了调用没有参数的方法的解决方案。

我一直在使用函数调用没有参数的 getter,或者使用 Biconsumer 调用带参数的 setter。但是似乎用一个参数调用一个非 void 方法并不是那么容易......

有没有人有线索来做这项工作?非常感谢您的时间和帮助:)!

在当前形式下,代码无法编译,因为您无法真正从静态方法访问this.

除此之外,您可以从以下内容开始(我已经删除了不相关的部分(:

class Sample {
public static < T > void setFieldsMap(int fieldTag,
Function< Integer, T > messageGetter,
String fieldKey )  {
messageGetter.apply(fieldTag);
}
}
public class SampleTest {
private static String toString(Integer  val) { // an example of method
System.out.println("Converting " + val);
return val.toString();
}
public static void main(String[] args) {
Sample.setFieldsMap(123, SampleTest::toString, "someKey");
}
}

要考虑的另一点是,T并没有真正使用,因此可以用?代替

class Sample {
public static void setFieldsMap(int fieldTag,
Function< Integer, ? > messageGetter,
String fieldKey )  {
messageGetter.apply(fieldTag);
}
}

方法输入参数Function< Integer, T > messageGetter意味着您必须提供一个函数或方法引用,该引用将Integer作为输入并返回T作为输出。

方法引用message::getString不是有效的输入参数,因为getString(String s)String作为输入,而不是Integer

试想一下,如果你可以提供这个参数,那么该方法的实现messageGetter.apply(fieldTag)基本上会读作message.getString(fieldTag),这是行不通的,因为fieldTag是一个int

最新更新