Groovy在Java Optional上同时运行map和OrelGet
我在GroovyGroovy在Java Optional上同时运行map和OrelGet,java,groovy,lambda,optional,Java,Groovy,Lambda,Optional,我在Groovy2.4.16和Java8.0.212-zulu和Java.util.Optional中遇到了奇怪的行为 class HttpRegion { HttpRegion(RoutingContext context) { this.context = context } Optional<Region> region() { return java.util.Optional.of(...) } } 下面是代码: def optR
2.4.16
和Java8.0.212-zulu
和Java.util.Optional
中遇到了奇怪的行为
class HttpRegion {
HttpRegion(RoutingContext context) {
this.context = context
}
Optional<Region> region() {
return java.util.Optional.of(...)
}
}
下面是代码:
def optRegion = new HttpRegion(context).region()
optRegion.map{ region ->
log.info("FOUND REGION: ${region} - ${optRegion}")
}.orElseGet{
log.info("NO-REGION, JUST KIDDING! - ${optRegion}")
}
以下是日志:
2019-08-27 10:05:31.060 +0200 [vert.x-eventloop-thread-2] INFO c.n.p.XXX:85 - FOUND REGION: POLAND - Optional[POLAND]
2019-08-27 10:05:31.061 +0200 [vert.x-eventloop-thread-2] INFO c.n.p.XXX:87 - NO-REGION, JUST KIDDING! - Optional[POLAND]
我使用的是纯Groovy类,没有@CompileStatic
或任何其他注释
HttpRegion
返回常规java.util.Optional
class HttpRegion {
HttpRegion(RoutingContext context) {
this.context = context
}
Optional<Region> region() {
return java.util.Optional.of(...)
}
}
class-HttpRegion{
HttpRegion(路由上下文){
this.context=context
}
可选区域(){
返回(…)的java.util.Optional.of
}
}
谁能向我解释一下什么是错误的,以及为什么可选映射的两个分支都被执行?在
Optional
上调用map
将Optional的内容替换为map
返回的值
groovy闭包总是返回一个值
在这种情况下,它是null
值,这就是调用map
optRegion.map{ region ->
log.info("FOUND REGION: ${region} - ${optRegion}")
}.orElseGet{
log.info("NO-REGION, JUST KIDDING! - ${optRegion}")
}
如果你把它一分为二,你会看到它返回null
:
map{ region ->
log.info("FOUND REGION: ${region} - ${optRegion}")
}
然后调用这个闭包,因为您有null
orElseGet{
log.info("NO-REGION, JUST KIDDING! - ${optRegion}")
}
如果您将地图更改为:
map{ region ->
log.info("FOUND REGION: ${region} - ${optRegion}")
return region
}
那么您应该有一个单独的日志语句。这与问题有什么关系?问题是为什么执行两个分支的可选映射,而不是返回值。据我在Java中所知,orElseGet()
意味着如果可选项不是空的,就不能执行。哇,这太棒了。谢谢别介意我先前的评论。在第四次阅读你的答案后,我终于明白了你的意思。