私は、Javaslang-2.1.0-alphaとJavaslang-matchと同等のオブジェクト分解を使用しています。 「ファンシー道を一致」のダニエルthis by blog記事によると:Javaslangオブジェクトの分解が機能しない
Match(person).of(Case(Person("Carl", Address($(), $())), (street, number) -> ...))
street
とnumber
にAddress
内部の2つのワイルドカードパターンに一致する値を取得する必要がありますが、一例であってもコンパイルされません。私は後で、すべてのオブジェクトを原子パターン内にラップする必要があることを認識しました。つまり、「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)
コードをコンパイルすることはできません、ラムダ式は、次のエラー・テキストを赤い下線を取得します。
The target type of this expression must be a functional interface
javaslang-matchの最新バージョンで$_
の値を無視する方法はありません。だから私は上記のように3つのラムダパラメータを返す原子パターンのそれぞれにマッチしたい。
このライブラリを理解してくれた人には、このオブジェクトを最新のバージョンで分解する方法を私に説明する必要があります。
私は再エコー私は今理解して何をしてみましょう:私たちは私が達成したいものを達成したい場合は道の物事は、現在、私たちは、人の手の内側Addressオブジェクトを分解し、すべてのアドレスを配置する必要がありますPersonの直下にある属性。これは正しいです?? – egima
@egimaはい、正しいです! (遅い答えに申し訳ありません - 何とか私は通知されませんでした) –