我正在使用 Javaslang-2.1.0-alpha 及其 Javaslang-match 等效项来进行一些对象分解。根据Daniel 在“Match the Fancy way”部分的博客文章:
Match(person).of( Case(Person("Carl", Address($(), $())), (street, number) -> ...) )
Address
应该检索与内部两个通配符模式匹配的值street
,number
但该示例甚至无法编译。后来我意识到所有对象都必须包装在原子模式中,即“Carl”变为$(“Carl”)。这是在阅读了这个问题之后。
我按照更新的教程进行操作,但此示例没有更新。
我将示例更新为:
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
包含Carl和number
,整个Address
对象。
当我尝试添加第三个 lambda 参数来捕获Carl时:
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 参数的原子模式,如上所述。
我需要了解这个库的人向我解释如何在最新版本中进行对象分解。