Vavr中的命名参数功能

时间:2018-02-06 16:51:38

标签: java-8 functional-programming named vavr

Vavr User Guide在讨论其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(); }) );

有人可以详细说明这里命名的参数在哪里以及如何使用它们?提前谢谢。

1 个答案:

答案 0 :(得分: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();
      }));
}

希望这能澄清/帮助。