在Vavr中执行副作用

时间:2018-02-06 04:07:18

标签: java-8 functional-programming pattern-matching vavr

我正在阅读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.");}

1 个答案:

答案 0 :(得分:6)

这是io.vavr.API.run。根据Javadoc,您应该通过

导入基本的VAVR功能
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}}。