Функциональные интерфейсы Java: как обернуть функцию с помощью andThen или аналогичной - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть некоторый повторяющийся код, который идет:

        router.post("/fleets/:fleetid/vehicles/:boxid/ping").handler(ctx -> pingBox(pingBoxTimer, oemUrl, ctx));
        router.post("/fleets/:fleetid/vehicles/:boxid/wakeup").handler(ctx -> wakeUp(wakeupTimer, oemUrl, ctx));
        router.post("/fleets/:fleetid/vehicles/:boxid/passthrough").handler(ctx -> passthrough(passthroughTimer, oemUrl, ctx));
        router.post("/fleets/:fleetid/vehicles/:boxid/expert").handler(ctx -> passthrough(passthroughTimer, oemUrl, ctx));
        router.post("/fleets/:fleetid/vehicles/:boxid/door").handler(ctx -> door(doorTimer, oemUrl, ctx));

в обработчике этих методов, я:

  • запустить таймер
  • сделать что-нибудь
  • останов таймера

Например:

private void pingBox(Timer timer, String someArgs, RoutingContext ctx) {
    log.debug("ping request");

    Timer.Context timerCtx = timer.time();
    ctx.put("timer", timerCtx);

    ctx.response().headers().add("content-type", "text/plain");
    ctx.response().end("pong");

    timerCtx.stop();
}

Как можно обернуть обработчик, чтобы избежать повторения кода?

Я пробовал следующее:

private void handleWithTimer(Timer timer, String url, RoutingContext ctx, BiConsumer<String, RoutingContext> handler){

    log.debug("saving timer");
    Timer.Context timerCtx = timer.time();
    ctx.put("timer", timerCtx);

    handler.accept(url, ctx);

    timerCtx.stop();
}

, но результат не читается ..

.. .handler(ctx -> handleWithTimer(pingBoxTimer, oemUrl, ctx, (s, c) -> pingBox(oemUrl, ctx)));

Должен быть более краткий способ.Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете сделать вашу функцию переноса более читабельной, например:

.handler(ctx -> handleWithTimer(pingBoxTimer, oemUrl, ctx, this::pingBox));

(конечно, только после настройки ваших входных параметров pingBox, что, кажется, вы уже сделали)

...