在 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