Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Vavr中基于列表的模式匹配对象分解_Java_Functional Programming_Vavr - Fatal编程技术网

Java Vavr中基于列表的模式匹配对象分解

Java Vavr中基于列表的模式匹配对象分解,java,functional-programming,vavr,Java,Functional Programming,Vavr,是否有在vavrs集合上应用对象分解的选项 例如,类似于scala中的代码片段: val x = List(1, 2, 3) val t = x match { case List(a, b, c) => (a, b, c) } (在本例中,我们将列表转换为元组) 我在这里看到了一些与我的案例类似的例子,但看起来当前的语法不同,甚至不可能 Vavr列表与许多功能程序一样,由一个头(单个元素,称为Cons)和一个尾(另一个列表)组成,可以匹配第一个元素(不是最后一个,除非颠倒列表),

是否有在vavrs集合上应用对象分解的选项

例如,类似于scala中的代码片段:

val x = List(1, 2, 3)

val t = x match {
  case List(a, b, c) => (a, b, c)
}
(在本例中,我们将列表转换为元组)


我在这里看到了一些与我的案例类似的例子,但看起来当前的语法不同,甚至不可能

Vavr列表与许多功能程序一样,由一个头(单个元素,称为Cons)和一个尾(另一个列表)组成,可以匹配第一个元素(不是最后一个,除非颠倒列表),尽管这比Scala/Haskell更详细。此外,虽然可以匹配前3个元素,但只能捕获第一个:

var t = Match(x).of(
  Case($Cons($(), $Cons($(), $Cons($(), $()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);
:

当前的API做出了妥协,即所有模式都是匹配的,但是 只分解根模式

编辑:如果您希望列表中正好有3个元素,则需要确保第三个元素后面的尾部是空列表(称为Nil):


Vavr列表与许多功能程序一样,由一个头(单个元素,称为Cons)和一个尾(另一个列表)组成,可以匹配第一个元素(不是最后一个,除非颠倒列表),尽管这比Scala/Haskell更详细。此外,虽然可以匹配前3个元素,但只能捕获第一个:

var t = Match(x).of(
  Case($Cons($(), $Cons($(), $Cons($(), $()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);
:

当前的API做出了妥协,即所有模式都是匹配的,但是 只分解根模式

编辑:如果您希望列表中正好有3个元素,则需要确保第三个元素后面的尾部是空列表(称为Nil):

是一个简单的java库,它可以使用Java8特性模拟一些特性模式匹配。 该库还支持解构模式

   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));
   });
解构类必须具有一个或多个提取方法。 它们必须标记为annotation@Extract。参数必须是 输出。因为不能使用基元和基元类型的包装器 通过引用传递我们必须使用诸如IntRef、FloatRef等包装器

   @Extract
   public void deconstruct(IntRef width, IntRef height) {
      width.set(this.width);
      height.set(this.height);
   }      
是一个简单的java库,它可以使用Java8特性模拟一些特性模式匹配。 该库还支持解构模式

   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));
   });
解构类必须具有一个或多个提取方法。 它们必须标记为annotation@Extract。参数必须是 输出。因为不能使用基元和基元类型的包装器 通过引用传递我们必须使用诸如IntRef、FloatRef等包装器

   @Extract
   public void deconstruct(IntRef width, IntRef height) {
      width.set(this.width);
      height.set(this.height);
   }      

如果你能解释代码的实际功能,它会将列表转换为元组,但我也能想象当你想匹配列表中第一个元素等于1,然后提取第二个元素时的情况。如果你能解释代码的实际功能,它会将列表转换为元组,但我也能想象当你想匹配列表中第一个元素时的情况元素等于1,然后提取第二个元素。为了100%正确,我们应该检查列表是否正好有3个元素(且不超过):var t=Match(x)。of(Case($Cons($(),$Cons($(),$Cons($(),$Nil()),(a,tail)->Tuple(a,tail.head(),x.get(2));除此之外,非常感谢,$Cons模式是关键。没有注意到你正期待着3个元素,我的坏!为了100%正确,我们应该检查列表是否正好有3个元素(并且不超过):var t=Match(x).of(Case($Cons($(),$Cons($(),$Cons($(),$Nil()),(a,tail)->Tuple(a,tail.head(),x.get(2));除此之外,非常感谢,$Cons模式是关键。没有注意到你正期待着3个元素,我的坏!