Подходим по параметрам внутри Tuple с Vavr - PullRequest
1 голос
/ 08 июня 2019

Используя типы Vavr , я создал пару Some s:

var input = Tuple(Some(1), Some(2));

Я хотел бы получить целые числа1 и 2 с использованием выражения совпадения Вавра;вот как я сейчас это делаю:

import static io.vavr.API.*;
import static io.vavr.Patterns.$Some;
import static io.vavr.Patterns.$Tuple2;

var output = Match(input).of(
        Case($Tuple2($Some($()), $Some($())),
                (fst, snd) -> fst.get() + "/" + snd.get()),
        Case($(), "No match")
);

Это работает и возвращает "1/2", но меня беспокоит, так как я вызываю небезопасные get методы для двух Some s.

Я бы предпочел, чтобы выражение соответствия было разложено input до точки, где оно извлекает самые внутренние целые числа.

Эта заметка в руководстве пользователя Vavr заставляет меня усомниться в том, что это возможно:

first Первый прототип Vavr Match API позволил извлечь пользовательский выбор объектов из шаблона совпадения.Без надлежащей поддержки компилятора это неосуществимо, потому что число сгенерированных методов увеличилось в геометрической прогрессии.Текущий API делает компромисс в том, что все шаблоны сопоставляются, но декомпозируются только корневые шаблоны.

И все же мне все еще интересно, есть ли более элегантный, безопасный для типов способ декомпозиции вложенного значения input.

1 Ответ

2 голосов
/ 14 июня 2019

Я бы использовал Tuple.apply (*) в сочетании с API.For (*) следующим образом:

var output = input.apply(API::For)
    .yield((i1, i2) -> i1 + "/" + i2)
    .getOrElse("No match");

(*): предоставляются ссылки на перегрузки двух аргументов в соответствии с вашим примером

...