Sim*_*zon 2 functional-programming pattern-matching java-8 vavr
我正在阅读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 Code Online (Sandbox Code Playgroud)
然后讨论如何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.";}
Run Code Online (Sandbox Code Playgroud)
有人可以确认我是在正确的轨道上设想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.");}
Run Code Online (Sandbox Code Playgroud)
是的io.vavr.API.run.根据Javadoc,您应该通过导入基本的VAVR功能
import static io.vavr.API.*;
Run Code Online (Sandbox Code Playgroud)
该run函数调用一个Runnable(函数() -> void)一次并返回(Void)null.这是因为
Case($(isIn("-h", "--help")), o -> this.displayHelp())
Run Code Online (Sandbox Code Playgroud)
当不工作displayHelp()的void,因为void不是Java中的乖巧型.具体而言,Supplier<void>与Function<?, void>不工作.另外,
Case($(isIn("-h", "--help")), this.displayHelp())
Run Code Online (Sandbox Code Playgroud)
会displayHelp() 在比赛前执行,因此匹配无用.这排除了所有三个(忽略参数号)重载Case.run修复此问题,因为Supplier<Void>并且Function<?, Void> 是可能的,并采取一种Runnable方法可以推迟操作,直到Case需要参数为止.