我正在阅读Vavr Usage Guide关于使用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
不应该如何在lambda体外运行等。
恕我直言,解释中缺少一些让我完全清晰的东西,即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.");}
答案 0 :(得分:6)
这是io.vavr.API.run
。根据Javadoc,您应该通过
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
需要1}}。