在Vavr中执行副作用

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)

HTN*_*TNW 6

是的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需要参数为止.

  • 你的新代码是正确的,但没有理由没有返回值.如果没有返回值(这是不合需要的,因为它意味着副作用)运行用于解决Java的不规则性.如果有返回值(这是可取的,并且是通常的情况),就不要使用run. (3认同)