Как сопоставить шаблон кортежа Option с определенным типом в Java с помощью Vavr

новый пользователь Vavr здесь. Я пытаюсь сопоставить шаблон с кортежем параметров для выполнения операторов, если оба они являются Some, в Scala я бы сделал это с помощью:

val maybeThis: Option[String] = ???
val maybeThat: Option[String] = ???

(maybeThis, maybeThat) match {
  case (Some(dis), Some(that)) => ???
  case _ => ???
}

В Java я пробую этот подход:

Tuple2<Option<String>, Option<String>> tuple = new Tuple2<>(Option.of(...), Option.of(...));

return Match(tuple).of(
  Case($Tuple2($Some($(instanceOf(String.class))), $Some($(instanceOf(String.class)))),
                    (someThis, someThat) -> methodWhichEatsTwoStrings(someThis.get(), someThat.get())),
  Case($(), t -> run(() -> {
                throw new NullPointerException(...);
            })));

Однако с этой реализацией компилятор жалуется, что ожидал Some<Object> вместо Some<String>, та же ошибка возникает, если я опускаю $(instanceOf(String.class) в шаблоне.

Я умеренно уверен, что это просто проблема правильного синтаксиса, но я изо всех сил пытаюсь найти правильную документацию. Где я не прав? Спасибо


person Alessandro D'Armiento    schedule 03.09.2020    source источник


Ответы (1)


Существует API-конструкция vavr под названием для понимания, которая пытается имитировать Scala для понимания в той мере, в какой это возможно в Java. С этой конструкцией вы могли бы решить свою проблему довольно элегантно. См. Для перегрузки для обработки двух параметров для получения более подробной информации. Вот пример фрагмента кода:

String methodWhichEatsTwoStrings(String v1, String v2) {
    return v1 + v2; //combine the two values in some way
}

...

Option<String> option1 = Option.some("value1");
Option<String> option2 = Option.some("value2");

String combined = For(option1, option2)
    .yield((v1, v2) -> methodWhichEatsTwoStrings(v1, v2))
    .getOrElseThrow(() -> new NullPointerException("reasons"));

Конечно, вы можете использовать Option значения разных типов для option1 и option2 или комбинировать несколько вариантов, а не только два. Вы также можете использовать другой тип для возвращаемого значения функции yield. Я везде использовал String для простоты и соответствия вашему исходному примеру.

Я хотел бы добавить, что я бы постарался не выбрасывать NullPointerException в случае, если один или оба параметра пусты. Может быть, попробовать использовать другой тип данных vavr, например Either, для представления такого случая ошибки?

person Nándor Előd Fekete    schedule 07.09.2020