gpt4 book ai didi

Javaslang 对象分解不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:51 26 4
gpt4 key购买 nike

我正在使用 Javaslang-2.1.0-alpha 和它的 Javaslang-match 来做一些对象分解。根据 this by blog Daniel 在“Match the Fancy way”部分发表的帖子:

Match(person).of( Case(Person("Carl", Address($(), $())), (street, number) -> ...) )

应该检索与 Address 中的两个通配符模式匹配的值进入 streetnumber但该示例甚至无法编译。后来我意识到所有对象都必须包裹在原子模式中,即“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目的。

当我尝试添加第三个 lambda 参数来捕获 时卡尔 :
 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 参数,如上所述。

我需要了解这个库的人向我解释如何在最新版本中进行这个对象分解。

最佳答案

免责声明:我是 Javaslang 的创造者。

案例需要处理 (String, Address) -> {...}。 $() 匹配任意值,但处理程序/函数仅接收分解对象树的第一层。 $() 位于第二层。

规则:所有层都与模式匹配,只有第一层传递给处理程序。

Match 的第一个原型(prototype)实际上可以处理任意的树深度,但需要为所有可能的组合在幕后生成方法 - 很容易超过最大字节代码大小,并且编译时间呈指数级增长到无限。

当前版本的 Match 是我目前看到的 Java 中唯一实用的方法。

更新:

请让我对这个话题进行更形象的更新。

我们区分

  • 对象图 输入
  • 模式树传递给火柴盒
  • 分解的物体对象图

  • 广告 1) 对象图

    给定一个对象,通过遍历该对象的属性(或实例变量)来跨越对象图。值得注意的是,我们不禁止对象包含循环(例如包含自身的可变列表)。

    在 Javaslang 中,没有自然的方法可以将一个对象分解成它的各个部分。为此,我们需要一个所谓的模式。

    对象图示例:
         Person        <-- root
    / \
    "Carl" Address <-- 1st level
    / \
    "Milkyway" 42 <-- 2nd level

    广告 2) 模式树

    模式(实例)本质上定义了如何分解对象。

    在我们的示例中,模式类型如下所示(简化的泛型):
     Pattern2<Person, String, Address<String, Integer>>
    / \
    Pattern0<String> Pattern2<Address, String, Integer>
    / \
    Pattern0<String> Pattern0<Integer>

    被调用的模式方法返回上述类型的实例:
          Person(...)
    / \
    $("Carl") Address(...)
    / \
    $() $()

    Javaslang 的 Match API 执行以下操作:
  • Match 实例通过给定的 person反对第一个案例。
  • 案例通过person反对该模式 Person(...)
  • Person(...)模式检查给定的对象是否 person类型为 Person .
  • 如果为真,则该模式将对象分解为其各个部分
    (由元组表示)并检查子模式是否 $("Carl")Address(...)匹配这些部分(递归重复 3。)
  • 如果为 false,则 Match 将对象传递给下一个 Case(参见 2。)
  • 如果模式是原子的,即它不能再分解对象,则检查相等性并一直通知调用者返回匹配案例。
  • 当匹配案例获得模式匹配时 然后传递对象图第一层的分解对象到匹配案例处理程序。

  • 当前 Java 的类型系统不允许我们以类型化的方式将任意对象图/树级别的匹配对象传递给处理程序。

    广告 3) 分解的物体

    我们已经在上面的 2) 中提到了对象分解。特别是当我们给定对象的部分被发送到模式树时使用它。

    由于我们上面提到的类型系统的限制,我们将匹配对象的过程与处理分解部分的过程分开。

    Java 允许我们匹配任意对象图。我们不限于这里的任何级别。

    但是,当一个对象成功匹配时,我们只能将第一层的分解对象传递给处理程序。

    在我们的例子中,这些分解的对象是 nameaddress给定的 person (而不是 streetnumber )。

    我知道这对 Match API 的用户来说并不明显。

    下一个 Java 版本将包含值对象和 native 模式匹配!但是,该版本的模式匹配将完全限于第一级。

    Javaslang 允许匹配任意对象图 - 但它有代价。处理程序只接收分解对象的第一层,这可能会令人困惑。

    我希望这以一种可以理解的方式回答了这个问题。

    - 丹尼尔

    关于Javaslang 对象分解不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41588911/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com