1

LambdaJ を調べ始めたところ、すぐに問題が発生しました。私は何か変なことをしているとは思いませんが、これを行う方法がわかりません。

管理者のリストがあります:

List<Administrator> allAdmins; 

これらの管理者をマップしたいマップがあります:

Map<String, Administrator> adminIdToAdmin = new HashMap<String, Administrator>();

問題は、Administrator クラスの ID が String ではなく Long であることです。だから、私は次のことを試しました:

adminIdToAdmin = index(allAdmins, on(Administrator.class).getAdministratorId().toString());

これは機能しません。次のエラーで失敗します。

ch.lambdaj.function.argument.ArgumentConversionException: Unable to convert the placeholder -2147483647 in a valid argument
    at ch.lambdaj.function.argument.ArgumentsFactory.actualArgument(ArgumentsFactory.java:92)
    at ch.lambdaj.function.convert.ArgumentConverter.<init>(ArgumentConverter.java:29)
    at ch.lambdaj.Lambda.index(Lambda.java:1133)

マップを Long を含むように変更し、toString() を取り除くと、エラーはなくなります。

これを行う正しい方法は何ですか?

4

2 に答える 2

1

Mario Fusco (LambdaJ 作成者) によると:

これはよく知られており、よく文書化されている lambdaj の制限です。Long のような最終クラスは、プロキシ可能でないため、それ以上参照できません。

2 つの利用可能なソリューションは次のとおりです。

  1. 管理者クラスに getAdministratorIdAsString() を追加します
  2. 独自の Converter を作成し、それを index メソッドに渡します
于 2013-04-04T17:38:26.203 に答える
0

同じプレースホルダー値: -2147483647 で、まったく同じ問題がありました。ラムダジ抽出メソッドをコレクションのすべての要素に適用していたコード ブロックを、コレクションに対する従来の反復処理に置き換えたところ、アプリケーションが動作するようになりました。これは om.googlecode.lambdaj lambdaj version 2.3.3 のバージョン 2.3.3 に関連するバグだと思います。

前(失敗)

 return ch.lambdaj.Lambda.extract(sourceMsg.getAttachments(), on(Attachment.class)
                .getDataHandler().getDataSource())

後(作業中)

List<DataSource> lds= new ArrayList<DataSource>();
        Collection<Attachment> attachmentList = sourceMsg.getAttachments();
        for(Attachment a:attachmentList)
        {
            result.add(a.getDataHandler().getDataSource());
        }
        return lds;
于 2015-10-15T09:59:48.487 に答える