1

我刚开始研究 LambdaJ,马上就遇到了问题。我不认为我在做任何奇怪的事情,但我不知道该怎么做。

我有一个管理员列表:

List<Administrator> allAdmins; 

我有一张地图,我希望将这些管理员映射到:

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

问题是 Administrator 类中的 ID 是 Long,而不是 String。所以,我尝试了以下方法:

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)

如果我将地图更改为包含 Longs 并删除 toString(),错误就会消失。

这样做的正确方法是什么?

4

2 回答 2

1

根据 Mario Fusco(LambdaJ 创建者):

这是 lambdaj 的一个众所周知且有据可查的限制:您不能进一步引用像 Long 这样的最终类,因为它不可代理。

两种可用的解决方案是:

  1. 将 getAdministratorIdAsString() 添加到管理员类
  2. 编写自己的 Converter 并将其传递给 index 方法
于 2013-04-04T17:38:26.203 回答
0

我遇到了完全相同的问题,具有相同的占位符值:-2147483647。我用对集合的经典迭代替换了将 lambdaj extract 方法应用于集合的所有元素的代码块,现在我的应用程序可以工作了。我猜这是与 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 回答