0

Vavr 用户指南named parameters在讨论其功能时参考了以下代码:

命名参数

Vavr 利用 lambdas 为匹配值提供命名参数。

 Number plusOne = Match(obj).of(
     Case($(instanceOf(Integer.class)), i -> i + 1),
     Case($(instanceOf(Double.class)), d -> d + 1),
     Case($(), o -> { throw new NumberFormatException(); }) );

有人可以详细说明命名参数在哪里起作用以及它们是如何使用的吗?先感谢您。

4

1 回答 1

0

我认为他们的意思是,如果没有 Vavr,您将不得不将匹配的对象转换为匹配的类型(例如,在第 2 行,您需要转换为 Integer)。使用 Vavr,在 lambda 中,参数已经是正确类型的匹配对象,您不需要强制转换它。

int withoutVavr(Object obj) {
  if (obj instanceof Integer) {
    return ((Integer) obj) + 42;
  } else if (obj instanceof String) {
    return ((String) obj).concat("obj is just an Object until I cast it").length();
  }
  throw new NumberFormatException();
}

int withVavr(Object obj) {
  return Match(obj).of(
      Case($(instanceOf(Integer.class)), i -> i + 42),
      Case($(instanceOf(String.class)),
          blabla -> blabla.concat("blabla is a string, I did not need to cast it; also, I could rename it to blabla thanks to lambdas, without writing the tedious 'String blabla = (String) obj'").length()),
      Case($(), o -> {
        throw new NumberFormatException();
      }));
}

希望这可以澄清/帮助。

于 2018-02-11T22:43:15.673 回答