Выполнение побочных эффектов в Вавре

Я просматриваю раздел Руководства по использованию Vavr о выполнении побочных эффектов с помощью Match и другого "синтаксического сахара", как они его называют. Вот пример, приведенный там:

Match(arg).of(
    Case($(isIn("-h", "--help")), o -> run(this::displayHelp)),
    Case($(isIn("-v", "--version")), o -> run(this::displayVersion)),
    Case($(), o -> run(() -> {
        throw new IllegalArgumentException(arg);
    }))
);

а затем идет обсуждение того, как run не следует запускать вне лямбда-тела и т. д.

ИМХО, чего-то не хватало в объяснении, чтобы дать мне полную ясность, т.е. run существующий метод в каком-то интерфейсе Vavr (который я не смог найти) или это должен быть мой собственный метод в базе окружающего кода?

Поэтому я немного постарался и изложил приведенный выше пример, чтобы я мог запустить его и увидеть его результаты:

@Test public void match(){

String arg = "-h";

        Object r = Match(arg).of(
                Case($(isIn("-h", "--help")), o -> run(this::displayHelp)),
                Case($(isIn("-v", "--version")), o -> run(this::displayVersion)),
                Case($(), o -> run(() -> {
                    throw new IllegalArgumentException(arg);
                }))
            );

        System.out.println(r);
    }

    private Void run(Supplier<String> supp) {
        System.out.println(supp.get());
        return null;}

    private String displayHelp() {return "This is a help message.";}
    private String displayVersion() {return "This is a version message.";}

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

Заранее спасибо.

Обновлено:

import static io.vavr.API.run;

    @Test public void match1() {

            String arg = "-h";

            Object r = Match(arg).of(
                    Case($(isIn("-h", "--help")), o -> run(this::displayHelp)),
                    Case($(isIn("-v", "--version")), o -> run(this::displayVersion)),
                    Case($(), o -> run(() -> {
                        throw new IllegalArgumentException(arg);
                    }))
                );

            System.out.println("match: " +r);
        }

        //private Void run(Supplier<Void> supp) {supp.get();}

        private void displayHelp() {System.out.println("This is a help message.");}
        private void displayVersion() {System.out.println("This is a version message.");}

1 ответ

Решение

Это io.vavr.API.run, Согласно Javadoc, вы должны импортировать основные функции VAVR через

import static io.vavr.API.*;

run функция вызывает Runnable (функция () -> void) один раз и возвращается (Void)null, Используется потому что

Case($(isIn("-h", "--help")), o -> this.displayHelp())

не работает когда displayHelp() является void, поскольку void не хорошо ведет себя тип в Java. В частности, Supplier<void> а также Function<?, void> не работай. Дополнительно,

Case($(isIn("-h", "--help")), this.displayHelp())

выполнит displayHelp() до матча, поэтому совпадение бесполезно. Это исключает все три (игнорируя номер аргумента) перегрузки Case, run исправляет это, потому что Supplier<Void> а также Function<?, Void> возможны, и принимая Runnable означает, что действие может быть отложено до аргумента Case нужно.

Другие вопросы по тегам