如何使用optionals实现这个嵌套流?

Opa*_*pal 8 java functional-programming optional java-8 vavr

我有一个方法String作为输入,也应该返回一个String.

以下ASCII艺术介绍了逻辑流程:

Option<A> optA = finder.findA(input);

          optA
           /\
isEmpty() /  \ isDefined()  
         /    \
 "ERR_1"       Option<B> optB = finder.findB(optA.get().bid);
                      / \
           isEmpty() /   \ isDefined()
                    /     \
                "ERR_2"    opt2.get().id
Run Code Online (Sandbox Code Playgroud)

基本上给定input我正在寻找A包裹在一个包裹的对象Option.然后是A现在我正在寻找B- 包裹在一个Option,否则返回ERR_1.然后如果B存在则返回它的id,否则返回ERR_2.

我想知道如何使用选项(或模式匹配可能?)以一种简洁的方式(没有任何ifology)实现它 - 可能是单行.

有人可以建议吗?

可以在这里找到试用的源代码.

Grz*_*rek 5

看起来您有3个可能的退出点:

  1. optA empty - >"ERR_1"
  2. optA不为空&& optB为空 - >"ERR_2"
  3. 两者都不为空 - > optB.get().bid

你可以通过使用Javaslang来实现这一点:

 optA
   .map(a -> finder.findB(a.bid)
      .map(b -> b.bid)
      .getOrElse("ERR_2"))
   .getOrElse("ERR_1");
Run Code Online (Sandbox Code Playgroud)

如果optA是空的,我们会直接跳到orElse("ERR_1")

如果optA不为空,我们使用存储在里面的值来获取值b.bid"ERR_2"optB空虚的情况下.

此外,在纯Java 8中,它看起来像这样:

optA
  .map(a -> finder.findB(a.bid)
    .map(b -> b.bid)
    .orElse("ERR_2"))
  .orElse("ERR_1");
Run Code Online (Sandbox Code Playgroud)

  • @Makoto检查代码示例.ID也是字符串. (2认同)
  • @Makoto我想那些不是真正的错误代码,只是一些占位符类型来更好地说明流程 (2认同)