我正在努力解决一个小的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
。