2013-04-03 76 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;