LambdaJ index()和键类型转换

时间:2013-04-03 22:04:36

标签: lambdaj

我刚刚开始关注LambdaJ,并立即遇到了问题。我不认为我做了任何奇怪的事情,但我无法弄清楚如何做到这一点。

我有一个管理员列表:

List<Administrator> allAdmins; 

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

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

问题是Administrator类中的ID是Longs,而不是字符串。所以,我尝试了以下内容:

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(),则错误消失。

正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

根据Mario Fusco(LambdaJ创作者):

这是一个众所周知且记录良好的lambdaj限制:你不能进一步引用像Long这样的最终类,因为它不可代理。

两种可用的解决方案是:

  1. 将getAdministratorIdAsString()添加到Administrator类
  2. 编写自己的Converter并将其传递给索引方法

答案 1 :(得分:0)

我有完全相同的问题,具有相同的占位符值:-2147483647。我替换了代码块,它将lambdaj extract方法应用于集合的所有元素,对集合进行经典迭代,现在我的应用程序正常工作。我想这是一个与om.googlecode.lambdaj lambdaj版本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;