Функция именованных параметров в Vavr

Руководство пользователя Vavr ссылается на следующий фрагмент кода при обсуждении его named parameters функции:

Именованные параметры

Vavr использует лямбда-выражения для предоставления именованных параметров для совпадающих значений.

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

Может ли кто-нибудь уточнить, где здесь используются именованные параметры и как они используются? Заранее спасибо.


person Simeon Leyzerzon    schedule 06.02.2018    source источник


Ответы (1)


Я думаю, что они имеют в виду, что без Vavr вам пришлось бы привести совпадающий объект к совпадающему типу (например, в строке 2 вам нужно было бы привести к Integer). С Vavr в лямбде параметр уже является совпадающим объектом в правильном типе, вам не нужно было его приводить.

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();
      }));
}

Надеюсь, это прояснит/поможет.

person Sir4ur0n    schedule 11.02.2018