2013-04-03 81 views
1

我刚开始看着LambdaJ,并立即遇到了问题。我不认为我做了什么奇怪的事,但我无法弄清楚如何做到这一点。LambdaJ index()和密钥类型转换

我有管理员列表:

List<Administrator> allAdmins; 

我有地图我希望这些管理员映射到:

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

的问题是,在管理类ID是多头,不是弦乐。所以,我尝试了以下内容:

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) 

如果我改变我的地图包含龙和摆脱toString(),错误消失。

什么是正确的方法来做到这一点?

回答

1

按照马里奥·福斯科(LambdaJ创建者):

这是众所周知的,有据可查的lambdaj的限制:你不能再引用一个final类象龙,因为它不是proxable。

的2级可用的解决方案是:

  1. 添加getAdministratorIdAsString()到管理员类
  2. 编写自己的转换器,并把它传递到索引方法
0

我有完全一样的问题,具有相同的占位符值:-2147483647。我替换了那个代码块,它将lambdaj提取方法应用到集合的所有元素,以及对集合的经典迭代,现在我的应用程序可以工作。我想这是一个与om.googlecode.lambdaj lambdaj 2.3.3版本2.3.3相关的bug。

之前(不及格)

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;