2

我正在阅读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不应该在 lambda body 之外运行,等等。

恕我直言,解释中缺少一些东西来让我完全清楚,即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.");}
4

1 回答 1

6

io.vavr.API.run。根据 Javadoc,您应该通过以下方式导入基本的 VAVR 功能

import static io.vavr.API.*;

run函数调用 a Runnable(a function () -> void) 一次并返回(Void)null。使用它是因为

Case($(isIn("-h", "--help")), o -> this.displayHelp())

displayHelp()当is时不起作用void,因为void它在 Java 中不是行为良好的类型。具体来说,Supplier<void>Function<?, void>工作。此外,

Case($(isIn("-h", "--help")), this.displayHelp())

将在匹配displayHelp() 之前执行,因此匹配是无用的。这排除了 . 的所有三个(忽略参数编号)重载Caserun解决了这个问题,因为Supplier<Void>Function<?, Void> 可能的,并且采取一种Runnable方法可以将动作推迟到Case需要参数时。

于 2018-02-06T04:23:52.797 回答