亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模式匹配對象分解在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條經驗 獲得超5個贊

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 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號