Groovy在Java Optional上同时运行map和OrelGet

Groovy在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

我在Groovy
2.4.16
和Java
8.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()
意味着如果可选项不是空的,就不能执行。哇,这太棒了。谢谢别介意我先前的评论。在第四次阅读你的答案后,我终于明白了你的意思。