2 回答

TA貢獻(xiàn)2016條經(jīng)驗 獲得超9個贊
Vavr Lists就像在許多函數(shù)式程序中一樣,由一個head(單個元素,稱為Cons)和一個tail(另一個列表)組成,可以在第一個元素上匹配(而不是最后一個,除非通過反轉(zhuǎn)列表),盡管這將比Scala / Haskell更詳細(xì)。此外,雖然您可以在前3個元素上進行匹配,但您只能捕獲第一個元素:
var t = Match(x).of(
Case($Cons($(), $Cons($(), $Cons($(), $()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);
模式匹配的Vavr文檔及其局限性:
當(dāng)前的 API 做出了一個折衷方案,即所有模式都匹配,但只有根模式被分解。
編輯:如果您想要列表中的3個元素,那么您需要確保第三個元素之后的尾部是空列表(稱為Nil):
var t = Match(x).of(
Case($Cons($(), $Cons($(), $Cons($(), $Nil()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);

TA貢獻(xiàn)1821條經(jīng)驗 獲得超5個贊
JMPL是一個簡單的java庫,它可以使用Java 8功能模擬一些功能模式匹配。此庫還支持解構(gòu)模式
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));
});
解構(gòu)類必須具有一個或多個提取方法。它們必須標(biāo)記為注釋@Extract。必須輸出參數(shù)。由于基元類型的基元和包裝器不能通過引用傳遞,因此我們必須使用IntRef,F(xiàn)loatRef等包裝器。
@Extract
public void deconstruct(IntRef width, IntRef height) {
width.set(this.width);
height.set(this.height);
}
添加回答
舉報