我正在使用Javaslang-2.1.0-alpha及其Javaslang-match等價物來做一些對象分解。據this by blog後由丹尼爾的「匹配花式的方式」一節中:Javaslang對象分解不起作用
Match(person).of(Case(Person("Carl", Address($(), $())), (street, number) -> ...))
如果檢索匹配內部Address
兩個通配符模式值到street
和number
不過的例子甚至不編譯。後來我意識到所有對象都必須被包裝在原子模式中,即「Carl」變成$(「Carl」)。這是在閱讀this issue後。
我跟着updated tutorial但這個例子沒有更新。
我的例子更新到這一點:
Person person = new Person("Carl", new Address("Milkyway", 42));
String result2 = Match(person).of(
Case(Person($("Carl"), Address($(),$())),
(street, number) -> "Carl lives in " + street + " " + number),
Case($(),() -> "not found")
);
System.out.println(result2);
它編譯,但我的價值沒有被正確匹配,從控制檯輸出判斷:
Carl lives in Carl Address [street=Milkyway, number=42]
很明顯,street
包含卡爾和number
,整個Address
對象。
當我嘗試添加第三拉姆達參數趕上卡爾:
Case(Person($("Carl"), Address($(),$())),
(name, street, number) -> "Carl lives in " + street + " " + number)
的代碼無法編譯,lambda表達式得到一個紅色下劃線與下面的錯誤文本:
The target type of this expression must be a functional interface
在最新版本的javaslang-match中,沒有辦法忽略$_
的值。所以我想匹配每個原子模式,它將返回如上所述的三個lambda參數。
我需要理解這個庫的人來向我解釋如何在最新版本中做這個對象分解。
讓我再重複一下我現在明白了:事情的方式,目前,如果我們要實現什麼,我想實現,我們必須手工分解內部人地址對象,並把所有地址屬性直接在Person下。它是否正確?? – egima
@egima是的,這是正確的! (對於遲到的答案感到抱歉 - 不知何故,我沒有通知) –