如何在 Java 函数接口中使用 andThen 或类似函数包装函数
How to wrap a function with andThen or similar in Java functional interface
我有一些重复代码:
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)));
一定有更简洁的方法。有什么想法吗?
您可以像这样使包装函数更具可读性:
.handler(ctx -> handleWithTimer(pingBoxTimer, oemUrl, ctx, this::pingBox));
(当然只有在你调整了pingBox的输入参数之后,你好像已经做了)
我有一些重复代码:
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)));
一定有更简洁的方法。有什么想法吗?
您可以像这样使包装函数更具可读性:
.handler(ctx -> handleWithTimer(pingBoxTimer, oemUrl, ctx, this::pingBox));
(当然只有在你调整了pingBox的输入参数之后,你好像已经做了)