Fragmento de código:

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, 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);
}

}

¿Qué tipo de interfaz funcional puedo usar en lugar de SomeConsumer? El problema principal aquí es que no es un campo estático, y el objeto solo lo conoceré en tiempo de ejecución.

Intenté usar BiConsumer, sin embargo, me dice que no puedo referirme a un método no estático de esta manera.

0
migAlex 26 ago. 2020 a las 05:11

1 respuesta

La mejor respuesta

De su uso aquí:

consumer.apply(documentPublisher, "documentName", "testId1");

Está bastante claro que el consumidor consume 3 cosas, por lo que no es un BiConsumer. Necesitaría un TriConsumer, que no está disponible en la biblioteca estándar.

Sin embargo, puede escribir una interfaz tan funcional usted mismo:

interface TriConsumer<T1, T2, T3> {
    void accept(T1 a, T2 b, T3 c);
}

Si los únicos parámetros genéricos que le vas a dar son <DocumentPublisher, String, String>, creo que deberías nombrarlo con algo específico para tu aplicación, como 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, "documentName", "testId1");
}
2
Sweeper 26 ago. 2020 a las 02:33