1

我是新的 vavr,所以我不知道我是否缺少一些基本的东西,但我正在做 Java 目前没有的模式匹配。调试后,我意识到 vavr 匹配所有案例,但如果案例条件不匹配,如果提供了供应商,则不会执行该值。那正确吗?

例如:

public Enum Days{
    MONDAY,
    TUESDAY...
}

String s = Match(days).of(
        Case($(Days.MONDAY), "monday"),
        Case($(Days.TUESDAY), "tuesday")
);

在上面的示例中,如果 days = MONDAY 它调用 CASE 方法传递枚举值并检查是否存在匹配项。在这种情况下,它是匹配的,因此它将返回“星期一”。我希望模式匹配会在我们得到匹配后终止。但事实证明,TuESDAY 也再次进入 Case 方法,模式不匹配,因此值仍然是“星期一”,但我想知道一旦满足条件,有没有办法停止模式匹配。

4

2 回答 2

7

VavrMatch 在第一次匹配时停止Case并返回关联的值。

您所遇到的只是标准的 Java 行为。参数在传递给方法之前会被急切地评估,所以,当你写

Case(Pattern, retValExpression)

andretValExpression是一个表达式,在将其传递给工厂方法之前,该retValExpression表达式将被急切地求值。API.Case如果您希望仅在匹配时才对retValExpression表达式进行延迟Case评估,则需要Supplier通过创建 lambda 表达式将其转换为 a:

Case(Pattern, () -> retValExpression)

在这种情况下,只有在对应的匹配() -> retValExpression时才会评估lambda 表达式。Case

如果您的问题在于Pattern表达式被急切求值,您可以应用相同的技术通过为 a 提供 lambda 将它们转换为惰性求值Predicate

Case($(value -> test(value)), () -> retValExpression)
于 2019-05-02T20:55:44.167 回答
1

I disagree: as soon as a case matches, it stops evaluating other cases, assuming you write your cases in lazy mode (e.g. with Predicates and Suppliers). The problem comes from Java being eager by default on its arguments evaluation, this has nothing to do with Vavr.

Here's a counter-example of what you claim. Please note:

  • the matchers are lazy (written with Predicate)
  • the values are lazy (written with Supplier)

.

public class Main {
  public static void main(String[] args) {
    var result = Match("foo").of(
        Case($(choice("one")), () -> result("1")),
        Case($(choice("two")), () -> result("2"))
    );

    System.out.println(result);
  }

  static Predicate<String> choice(String choice) {
    return string -> {
      System.out.println("Inside predicate " + choice);
      return true;
    };
  }

  static String result(String result) {
    System.out.println("Inside result " + result);
    return result;
  }
}

When executed, this yields:

Inside predicate one

Inside result 1

1

Please note that neither the second predicate nor the second result were ever evaluated.

于 2019-05-02T21:35:44.550 回答