我的代碼不編譯,我不太清楚爲什麼。下面是代碼: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));
我建議你添加一些類型信息給自己提示,因爲類型混淆的原因可能在此代碼中的任何地方。很可能你有一個原始類型的地方。 –
您的解決方案包含了可能需要昂貴的'Set'散列,並且可能需要更多的臨時內存。您的原始代碼可以正常使用'javac'和適當的'ClassificationData'和'FeatureData'聲明。或者,您沒有顯示的ClassificationData和FeatureData的定義存在問題,或者您正在使用Eclipse,這在類型推斷中有時會遇到問題。 – Holger
@Holger我正在使用Oracle Java 8. ClassificationData和FeatureData都是自動生成的DTO,因此我無法對它們做太多的工作。使用的字段是'Collection分類;'''''集合特徵;'這是我嘗試用其他線程中Car的簡單示例來描述的問題,您已經回覆了這個問題。 –
qwerty1423