【问题标题】:Performing side-effects in Vavr在 Vavr 中执行副作用
【发布时间】:2018-07-16 01:31:28
【问题描述】:

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

【问题讨论】:

  • 不确定您使用的是什么 IDE,但如果是 Eclipse,您可以通过 Preferences -> Java/Editor/Content Assist 设置自动导入的代码完成/Favorites -> 新类型... -> io.vavr.API
  • 是的,我正在使用 Eclipse,谢谢。
  • 也许可以通过提及 import static io.vavr.API.run; 来增强文档 - 否则并不明显(并且隐含地让人想起 Runnable)。

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


【解决方案1】:

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

导入基本的 VAVR 功能
import static io.vavr.API.*;

run 函数调用一次Runnable(函数() -&gt; void)并返回(Void)null。使用它是因为

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

displayHelp()void 时不起作用,因为void 在Java 中不是一个行为良好的类型。具体来说,Supplier&lt;void&gt;Function&lt;?, void&gt; 不起作用。此外,

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

会在匹配之前执行displayHelp()之前,所以匹配是没用的。这排除了Case 的所有三个(忽略参数编号)重载。 run 解决了这个问题,因为 Supplier&lt;Void&gt;Function&lt;?, Void&gt; 是可能的,并且采用 Runnable 意味着可以推迟操作,直到需要 Case 的参数。

【讨论】:

  • 啊,所以如果我理解正确,你的建议是我的初始版本是多余的,因为我重新实现了现有的io.Vavr.API.run() ,而代码应该类似于match1() 方法(见问题更新)?并且副作用产生方法是严格针对副作用的,没有期望的返回值?
  • 你的新代码是正确的,但没有理由没有返回值。如果没有返回值(这是不可取的,因为它意味着副作用),则使用 run 来绕过 Java 的不规则性。如果有返回值(这是可取的,并且是通常的情况),请不要使用 run。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多