【问题标题】:Clean way to chain multiple Try results using Vavr使用 Vavr 链接多个 Try 结果的干净方式
【发布时间】:2021-06-25 15:48:22
【问题描述】:

在我的项目中,我经常有一个模式,我将多个方法链接起来,这些方法可能会成功也可能不会成功。
我很难找到使用 Vavr 实现它的最干净的方法。 除了这两种方法,还有其他方法吗?
最好是不需要我创建不必要的 lambda,我什至不使用传递的变量。

   // First way to do it: use flatMap to chain it
    public Try<String> mainMethod(String someParam) {
        return firstOperation()
                .flatMap(v -> secondOperation(someParam))
                .flatMap(v -> thirdOperation(someParam));
    }
   // Second way to do it: pattern matching
    public Try<String> otherMainMethod(String someParam) {
        Try<String> firstResult = firstOperation();
        return Match(firstResult)
                .of(
                        Case(
                                $Success($()),
                                () -> {
                                    Try<String> secondResult = secondOperation(someParam);
                                    return Match(secondResult)
                                            .of(
                                                    Case($Success($()), thirdOperation(someParam)),
                                                    Case($Failure($()), secondResult));
                                }),
                        Case($Failure($()), firstResult));
    }

    private Try<String> firstOperation() {
        return Try.of(
                () -> {
                    // do something
                });
    }

    private Try<String> secondOperation(String someParam) {
        return Try.of(
                () -> {
                    // Try something
                });
    }

    private Try<String> thirdOperation(String someParam) {
        return Try.of(
                () -> {
                    // Try something
                });
    }

【问题讨论】:

    标签: java functional-programming vavr


    【解决方案1】:

    一个优雅的解决方案是使用 vavr 的 for comprehension:

    public Try<String> yetAnotherMainMethod(String someParam) {
       return API.For(firstOperation(), secondOperation(someParam), thirdOperation(someParam)).yield((s, s2, s3) -> s.concat(s2).concat(s3));
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 2015-05-28
      • 2017-04-26
      • 2013-10-19
      • 2014-07-10
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      相关资源
      最近更新 更多