Выполнение побочных эффектов в Вавре
Я просматриваю раздел Руководства по использованию 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
нужно.