在 Vavr 中执行副作用
Performing side-effects in Vavr
我正在阅读 Vavr Usage Guide 中关于使用 Match 和其他 "syntactic sugar" 执行副作用的部分,正如他们所说的那样。这是那里给出的例子:
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.");}
是io.vavr.API.run
。根据 Javadoc,您应该通过
导入基本的 VAVR 功能
import static io.vavr.API.*;
run
函数调用一次Runnable
(一个函数() -> void
)和returns(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
。
我正在阅读 Vavr Usage Guide 中关于使用 Match 和其他 "syntactic sugar" 执行副作用的部分,正如他们所说的那样。这是那里给出的例子:
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.");}
是io.vavr.API.run
。根据 Javadoc,您应该通过
import static io.vavr.API.*;
run
函数调用一次Runnable
(一个函数() -> void
)和returns(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
。