2016-10-16 45 views
1

我的代碼不編譯,我不太清楚爲什麼。下面是代碼:Java 8流API收集器 - addAll不適用於參數對象,addAll未定義類型對象

ArrayList<ClassificationData> classifications = productData 
       .stream() 
       .filter(p -> CollectionUtils.isNotEmpty(p.getClassifications())) 
       .flatMap(p -> p.getClassifications().stream()) 
       .collect(groupingBy(ClassificationData::getName, 
         mapping(ClassificationData::getFeatures, 
           Collector.of(LinkedHashSet<FeatureData>::new, 
             (a,b) -> b.addAll(a), 
             (a,b) -> { 
              b.addAll(a); 
              return b; 
             }) 
         ))) 
       .entrySet() 
       .stream() 
       .map(e -> { 
        ClassificationData c = new ClassificationData(); 
        c.setName(e.getKey()); 
        c.setFeatures(e.getValue()); 
        return c; 
       }) 
       .collect(Collectors.toCollection(ArrayList::new)); 

而且錯誤:

(a,b) -> b.addAll(a), 
The method addAll(Collection<? extends FeatureData>) in the type Collection<FeatureData> is not applicable for the arguments (Object) 

    b.addAll(a); 
The method addAll(Object) is undefined for the type Object 

    c.setFeatures(e.getValue()); 
The method setFeatures(Collection<FeatureData>) in the type ClassificationData is not applicable for the arguments (Object) 

我也嘗試設置與::幾乎相同的結果添加和設置::中的addAll。

編輯:

我已經結束了這段代碼。請告訴我是否有更乾淨的方式來做到這一點,還是可以嗎?

ArrayList<ClassificationData> classifications = productData 
       .stream() 
       .filter(p -> CollectionUtils.isNotEmpty(p.getClassifications())) 
       .flatMap(p -> p.getClassifications().stream()) 
       .collect(groupingBy(ClassificationData::getName, 
         mapping(ClassificationData::getFeatures, 
           toCollection(LinkedHashSet::new) 
         ))) 
       .entrySet() 
       .stream() 
       .map(e -> { 
        ClassificationData c = new ClassificationData(); 
        c.setCode(e.getKey()); 
        c.setName(e.getKey()); 
        c.setFeatures(e.getValue() 
          .stream() 
          .filter(CollectionUtils::isNotEmpty) 
          .flatMap(p -> p.stream()) 
          .filter(distinctByKey(FeatureData::getName)) 
          .collect(toCollection(ArrayList::new))); 
        return c; 
       }) 
       .collect(toCollection(ArrayList::new)); 
+1

我建議你添加一些類型信息給自己提示,因爲類型混淆的原因可能在此代碼中的任何地方。很可能你有一個原始類型的地方。 –

+0

您的解決方案包含了可能需要昂貴的'Set'散列,並且可能需要更多的臨時內存。您的原始代碼可以正常使用'javac'和適當的'ClassificationData'和'FeatureData'聲明。或者,您沒有顯示的ClassificationData和FeatureData的定義存在問題,或者您正在使用Eclipse,這在類型推斷中有時會遇到問題。 – Holger

+0

@Holger我正在使用Oracle Java 8. ClassificationData和FeatureData都是自動生成的DTO,因此我無法對它們做太多的工作。使用的字段是'Collection 分類;'''''集合特徵;'這是我嘗試用其他線程中Car的簡單示例來描述的問題,您已經回覆了這個問題。 – qwerty1423

回答

3

我認爲你有第一個拉姆達混亂的參數的順序;它應該是

(set, a) -> set.add(a) 

...坦率地說,雖然它會是隻是爲了更好地與

toCollection(LinkedHashSet::new) 

即相當於更換整個收集創作。

+0

我已經試過這兩種方式。這結束了不同的錯誤消息 '方法addAll(集合)未定義類型對象' – qwerty1423

+1

您嘗試toCollection方法嗎?你是否試過在所有的lambda參數中包含顯式類型? –

+1

這兩個lambda都有自己的參數交換。 – MondKin

相關問題