为了账号安全,请及时绑定邮箱和手机立即绑定

模式匹配对象分解在Vavr中的列表中

模式匹配对象分解在Vavr中的列表中

慕尼黑8549860 2022-09-07 17:44:23
是否有任何选项可以在 vavrs 集合上应用对象分解?即来自scala的类似下面的代码片段:val x = List(1, 2, 3)val t = x match {  case List(a, b, c) => (a, b, c)}(在此示例中,我们将列表转换为元组)我在这里看到了一些类似于我的情况的例子,https://github.com/vavr-io/vavr/issues/1157 但看起来当前的语法不同,甚至是不可能的。
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

Vavr Lists就像在许多函数式程序中一样,由一个head(单个元素,称为Cons)和一个tail(另一个列表)组成,可以在第一个元素上匹配(而不是最后一个,除非通过反转列表),尽管这将比Scala / Haskell更详细。此外,虽然您可以在前3个元素上进行匹配,但您只能捕获第一个元素:


var t = Match(x).of(

  Case($Cons($(), $Cons($(), $Cons($(), $()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))

);

模式匹配的Vavr文档及其局限性:


当前的 API 做出了一个折衷方案,即所有模式都匹配,但只有根模式被分解。


编辑:如果您想要列表中的3个元素,那么您需要确保第三个元素之后的尾部是空列表(称为Nil):


var t = Match(x).of(

  Case($Cons($(), $Cons($(), $Cons($(), $Nil()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))

);


查看完整回答
反对 回复 2022-09-07
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

JMPL是一个简单的java库,它可以使用Java 8功能模拟一些功能模式匹配。此库还支持解构模式


   Figure figure = new Rectangle();


   let(figure, (int w, int h) -> {

      System.out.println("border: " + w + " " + h));

   });


   matches(figure).as(

      Rectangle.class, (int w, int h) -> System.out.println("square: " + (w * h)),

      Circle.class,    (int r)        -> System.out.println("square: " + (2 * Math.PI * r)),

      Else.class,      ()             -> System.out.println("Default square: " + 0)

   );


   foreach(listRectangles, (int w, int h) -> {

      System.out.println("square: " + (w * h));

   });

解构类必须具有一个或多个提取方法。它们必须标记为注释@Extract。必须输出参数。由于基元类型的基元和包装器不能通过引用传递,因此我们必须使用IntRef,FloatRef等包装器。


   @Extract

   public void deconstruct(IntRef width, IntRef height) {

      width.set(this.width);

      height.set(this.height);

   }      


查看完整回答
反对 回复 2022-09-07
  • 2 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信