性能问答>Option.orElseGet() 延迟执行的原理是什么?>
2回复
4年前

Option.orElseGet() 延迟执行的原理是什么?



通过 Optional 可以实现 “如果某个值为空则触发另一个逻辑” 这样的效果。

我有个业务场景是:尝试获取某个业务实体,如果获取到的实体为null则走创建逻辑来创建。代码如下:

// 先尝试查找: findBy(someQuery)
// 找不到则创建: someService.creat(someVo)
SomeEntity entity = someService.findBy(someQuery).orElse(someService.creat(someVo));

在调试过程中,我注意到 orElse() 无论如何都会执行内部的表达式,而 orElseGet(Supplier<? extends T> other)中的表达式则会根据 Optional 内部的 value 是否为 null 来决定是否执行。

然后我尝试看一下涉及到 orElseGet 的 class:

    INVOKEDYNAMIC get()Ljava/util/function/Supplier; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
      // arguments:
      ()Ljava/lang/Object;, 
      // handle kind 0x6 : INVOKESTATIC
      test/Test.lambda$main$0()Ljava/lang/String;, 
      ()Ljava/lang/String;
    ]
    INVOKESTATIC test/Test.testGet (Ljava/util/function/Supplier;)V

里面是 INVOKEDYNAMIC ,这里没太明白,是 INVOKEDYNAMIC 决定了延迟触发的行为吗?

3832 阅读
请先登录,查看2条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步