Java 8 在Vavr中执行副作用

Java 8 在Vavr中执行副作用,java-8,functional-programming,pattern-matching,vavr,Java 8,Functional Programming,Pattern Matching,Vavr,我正在浏览的部分是关于使用Match和其他他们称之为“语法糖”的东西来执行副作用的。以下是其中给出的示例: Match(arg).of( Case($(isIn("-h", "--help")), o -> run(this::displayHelp)), Case($(isIn("-v", "--version")), o -> run(this::displayVersion)), Case($(), o -> run(() -> {

我正在浏览的部分是关于使用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主体之外运行,等等

IMHO,在解释中缺少了一些东西让我完全清楚,即
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.";}
@Test public void match(){
字符串arg=“-h”;
对象r=匹配(arg).of(
Case($(isIn(“-h”,““--help”)),o->run(this::displayHelp)),
Case($(isIn(“-v”,“--version”)),o->run(this::displayVersion)),
案例($(),o->run(()->{
抛出新的IllegalArgumentException(arg);
}))
);
系统输出println(r);
}
私人作废运行(供应商支持){
System.out.println(supp.get());
返回null;}
私有字符串displayHelp(){return“这是一条帮助消息。”;}
私有字符串displayVersion(){return“这是一条版本消息。”;}
是否有人能确认我在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;
@测试公共无效匹配1(){
字符串arg=“-h”;
对象r=匹配(arg).of(
Case($(isIn(“-h”,““--help”)),o->run(this::displayHelp)),
Case($(isIn(“-v”,“--version”)),o->run(this::displayVersion)),
案例($(),o->run(()->{
抛出新的IllegalArgumentException(arg);
}))
);
System.out.println(“匹配:+r”);
}
//私有无效运行(供应商支持){supp.get();}
私有void displayHelp(){System.out.println(“这是一条帮助消息”);}
private void displayVersion(){System.out.println(“这是一条版本消息”);}
这是一个好消息。根据Javadoc,您应该通过

import static io.vavr.API.*;
run
函数调用一次
Runnable
(函数
()->void
)并返回
(void)null
。因为

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

displayHelp()
void
时不工作,因为
void
在Java中不是一种性能良好的类型。具体来说,
Supplier
函数不确定您使用的是什么IDE,但如果是Eclipse,您可以通过首选项->Java/Editor/Content Assist/Favorites->新类型设置自动导入的代码完成…->
io.vavr.API
是的,我正在使用Eclipse,谢谢。也许可以通过提及导入静态io.vavr.API.run来增强文档-否则就不明显了(这让人联想到
Runnable
)。啊,如果我理解正确的话,你的建议是,当我重新实现现有的
io.Vavr.API.run()
时,我的初始格式副本是多余的,相反,代码应该类似于
match1()
方法(参见问题更新)?副作用产生方法严格针对副作用,不需要返回值?您知道新代码是正确的,但没有理由不需要返回值。如果没有返回值(这是不可取的,因为它意味着副作用)run用于绕过Java的不规则性。如果有返回值(这是需要的,也是通常的情况),就不要使用run。
Case($(isIn("-h", "--help")), this.displayHelp())