Java 模式匹配匹配所有案例条件

Java 模式匹配匹配所有案例条件,java,vavr,Java,Vavr,我是新的vavr,所以我不知道我是否缺少一些基本的东西,但我正在做Java现在没有的模式匹配。调试后,我意识到vavr匹配所有案例,但如果案例条件不匹配,则如果提供供应商,则不会执行该值。是这样吗 例如: public Enum Days{ MONDAY, TUESDAY... } String s = Match(days).of( Case($(Days.MONDAY), "monday"), Case($(Days.TUESDAY), "t

我是新的vavr,所以我不知道我是否缺少一些基本的东西,但我正在做Java现在没有的模式匹配。调试后,我意识到vavr匹配所有案例,但如果案例条件不匹配,则如果提供供应商,则不会执行该值。是这样吗

例如:

public Enum Days{
    MONDAY,
    TUESDAY...
}

String s = Match(days).of(
        Case($(Days.MONDAY), "monday"),
        Case($(Days.TUESDAY), "tuesday")
);
在上面的示例中,如果days=MONDAY,它将调用CASE方法,传递枚举值并检查是否存在匹配项。在这种情况下,这是一场比赛,所以它将在周一返回。我希望模式匹配会终止,因为我们得到了匹配。但结果是它在星期二再次进入内部案例方法。同样,模式不匹配,因此值仍然是星期一,但我想知道是否有一种方法可以在满足条件后停止模式匹配。

Vavr match将在第一个匹配案例时停止,并返回相关值

您所经历的只是标准的Java行为。参数在传递给方法之前会被急切地求值,因此,当您编写

Case(Pattern, retValExpression)
retValExpression是一个表达式,在将它传递给API.Case工厂方法之前,retValExpression表达式将被急切地评估。如果希望retValExpression表达式仅在案例匹配时进行延迟计算,则需要通过创建lambda表达式将其转换为供应商:

Case(Pattern, () -> retValExpression)
在这种情况下,lambda expression->retValExpression将仅在对应的大小写匹配时计算

如果您的问题在于模式表达式的求值过于急切,您可以通过为谓词提供lambda,应用相同的技术将其转换为惰性求值:

Vavr匹配将在第一个匹配案例时停止,并返回相关值

您所经历的只是标准的Java行为。参数在传递给方法之前会被急切地求值,因此,当您编写

Case(Pattern, retValExpression)
retValExpression是一个表达式,在将它传递给API.Case工厂方法之前,retValExpression表达式将被急切地评估。如果希望retValExpression表达式仅在案例匹配时进行延迟计算,则需要通过创建lambda表达式将其转换为供应商:

Case(Pattern, () -> retValExpression)
在这种情况下,lambda expression->retValExpression将仅在对应的大小写匹配时计算

如果您的问题在于模式表达式的求值过于急切,您可以通过为谓词提供lambda,应用相同的技术将其转换为惰性求值:


我不同意:只要一个案例匹配,它就会停止评估其他案例,假设您以惰性模式编写案例,例如使用谓词和供应商。问题来自Java默认情况下对参数求值的渴望,这与Vavr无关

这里有一个你所声称的反例。请注意:

匹配器是用谓词编写的 这些值是由供应商编写的

执行时,这将产生:

内谓词一

内部结果1

一,


请注意,第二个谓词和第二个结果都没有被评估。

我不同意:只要一个案例匹配,它就会停止评估其他案例,假设您以惰性模式编写案例,例如使用谓词和供应商。问题来自Java默认情况下对参数求值的渴望,这与Vavr无关

这里有一个你所声称的反例。请注意:

匹配器是用谓词编写的 这些值是由供应商编写的

执行时,这将产生:

内谓词一

内部结果1

一,


请注意,第二个谓词和第二个结果都没有被评估。

Hi Nandor,我提供了一个供应商,它工作了,yes->retValExpression只有在案例匹配时才被评估。但我的问题不同。我的意思是说,即使我们有一个供应商作为所有案例的价值,它仍然会检查是否存在匹配,即使找到匹配。因此,如果未找到匹配项,它将不执行Supplier,但它仍然调用Case方法来检查每个匹配项,即使它只执行匹配项的值,因为它是一个Supplier。希望我的问题讲得通。我真的不明白。在构建案例值时,可能会遇到同样的问题,即在模式表达式中进行急切求值。如果是这样的话,这与我在回答中描述的情况完全相同,只是发生在不同的地方。Match.of将在第一次匹配时停止,我只是在源代码中查找它。请参阅。我更新了我的答案,以显示一个延迟计算的模式表达式示例(如果有帮助的话)。嗨,Nandor,我确实提供了一个供应商,它工作正常,并且只有在案例匹配时才会计算yes->retValExpression。但我的问题是
不同的我的意思是说,即使我们有一个供应商作为所有案例的价值,它仍然会检查是否存在匹配,即使找到匹配。因此,如果未找到匹配项,它将不执行Supplier,但它仍然调用Case方法来检查每个匹配项,即使它只执行匹配项的值,因为它是一个Supplier。希望我的问题讲得通。我真的不明白。在构建案例值时,可能会遇到同样的问题,即在模式表达式中进行急切求值。如果是这样的话,这与我在回答中描述的情况完全相同,只是发生在不同的地方。Match.of将在第一次匹配时停止,我只是在源代码中查找它。请参阅。我更新了我的答案,以显示一个懒惰计算的模式表达式的示例,如果这有帮助的话。明白了谢谢,我会让案例懒惰似乎也行得通。明白了谢谢,我会让案例懒惰似乎也行得通