如何解决非静态方法的Java Consumer MethodReference
代码段:
class Scratch {
Map<ActionType,SomeConsumer<DocumentPublisher,String,String>> consumerMapping = Map.of(
ActionType.REJECT,DocumentPublisher::rejectDocument,ActionType.ACCEPT,DocumentPublisher::acceptDocument,ActionType.DELETE,DocumentPublisher::deleteDocument);
private void runProcess(DocumentAction action) {
DocumentPublisher documentPublisher = DocumentPublisherFactory.getDocumentPublisher(action.getType);
SomeConsumer<DocumentPublisher,String> consumer = consumerMapping.get(action.getType());
consumer.apply(documentPublisher,"documentName","testId1");
}
private interface DocumentPublisher {
void rejectDocument(String name,String textId);
void acceptDocument(String name,String textId);
void deleteDocument(String name,String textId);
}
}
我可以使用哪种类型的functionalInterface代替SomeConsumer?这里的主要问题是它不是静态字段,而对象我只会在运行时知道。
我尝试使用BiConsumer,但是它告诉我不能以这种方式引用非静态方法。
解决方法
根据您的使用情况:
consumer.apply(documentPublisher,"documentName","testId1");
很明显,消费者消耗了3种东西,所以它不是BiConsumer
。您需要一个TriConsumer
,它在标准库中不可用。
您可以自己编写这样的功能接口:
interface TriConsumer<T1,T2,T3> {
void accept(T1 a,T2 b,T3 c);
}
如果您要提供的唯一通用参数是<DocumentPublisher,String,String>
,我认为您应该为应用程序指定特定的名称,例如DocumentPublisherAction
:
interface DocumentPublisherAction {
void perform(DocumentPublisher publisher,String name,String textId);
}
Map<ActionType,DocumentPublisherAction> consumerMapping = Map.of(
ActionType.REJECT,DocumentPublisher::rejectDocument,ActionType.ACCEPT,DocumentPublisher::acceptDocument,ActionType.DELETE,DocumentPublisher::deleteDocument);
private void runProcess(DocumentAction action) {
DocumentPublisher documentPublisher = DocumentPublisherFactory.getDocumentPublisher(action.getType);
DocumentPublisherAction consumer = consumerMapping.get(action.getType());
consumer.perform(documentPublisher,"testId1");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。