java类可选,Java可选:映射到子类或超级类

我正试图从Manning在爪哇的“AkkAin行动”中重写一个PoC项目的Scala例子。这个项目是一个小的HTTP服务器,用于创建事件和购买票据。

我正处在一个演员可以

Optional

对我

RestApi

. 根据值是否存在,我应该用

OK

其他

NOT_FOUND

.

在scala中,代码片段如下:

get {

// GET /events/:event

onSuccess(getEvent(event)) {

_.fold(complete(NotFound))(e => complete(OK, e))

}

}

…在哪里

getEvent

返回一个

Option[Event]

(相当于Java的

可选事件

)这就是我在Java中改写的方法:

get(() -> onSuccess(() -> getEvent(event), eventGetRoute()))

...

//and eventGetRoute() is a function:

private Function, Route> eventGetRoute() {

return maybeEvent -> maybeEvent.map(event -> complete(OK, event, Jackson.marshaller())).orElseGet(() -> complete(NOT_FOUND));

}

这不编译:

Bad return type in lambda expression: Route cannot be converted to RouteAdapter

. 越长(和第一个)

complete

返回A

RouteAdapter

第二个返回

Route

. 如果我这样重新编写上述函数:

private Function, Route> eventGetRoute() {

return maybeEvent -> {

if(maybeEvent.isPresent()) {

return complete(OK, maybeEvent.get(), Jackson.marshaller());

}

return complete(NOT_FOUND);

};

}

…那么编译器就不会抱怨了,但是它不是映射可选的正确方法。

Java没有

fold

方法用于可选(至少不在SE8中),它允许首先将回退传递给值。

我很好奇是否可以在尊重功能风格的基础上编写这个函数。

更新

:

正如评论中所要求的,这些是

完成

方法从

akka-http

JavaDSL库:

def complete(status: StatusCode): Route = RouteAdapter(

D.complete(status.asScala))

def complete[T](status: StatusCode, value: T, marshaller: Marshaller[T, RequestEntity]) = RouteAdapter {

D.complete(ToResponseMarshallable(value)(fromToEntityMarshaller(status.asScala)(marshaller)))

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值