Java 8流API收集器-addAll不适用于参数对象,addAll未定义为类型对象

Java 8流API收集器-addAll不适用于参数对象,addAll未定义为类型对象,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我的代码没有编译,我不太清楚为什么。代码如下: ArrayList<ClassificationData> classifications = productData .stream() .filter(p -> CollectionUtils.isNotEmpty(p.getClassifications())) .flatMap(p -> p.getClassificati

我的代码没有编译,我不太清楚为什么。代码如下:

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));
ArrayList分类=productData
.stream()
.filter(p->CollectionUtils.isNotEmpty(p.getClassifications())
.flatMap(p->p.getClassifications().stream())
.collect(分组依据)(ClassificationData::getName,
映射(ClassificationData::getFeatures,
Collector.of(LinkedHashSet::new,
(a,b)->b.addAll(a),
(a、b)->{
b、 阿道尔(a);
返回b;
})
)))
.entrySet()
.stream()
.map(e->{
ClassificationData c=新的ClassificationData();
c、 setName(例如getKey());
c、 setFeatures(如getValue());
返回c;
})
.collect(收集器.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)
(a,b)->b.addAll(a),

方法addAll(Collection我认为在第一个lambda中,参数的顺序搞乱了;应该是

(set, a) -> set.add(a)
…不过坦白说,用

toCollection(LinkedHashSet::new)

这是等效的。

我两种方法都试过了。这会产生不同的错误消息
方法addAll(Collection)未定义类型对象的类型。
是否尝试了toCollection方法?是否尝试为所有lambda参数在任何地方包含显式类型?两个lambda都交换了其参数。toCollection会创建一组集合,而这并不是我真正想要完成的。@LouisWasserman我想我已经成功地实现了根据你的建议我想要什么。我会用我现在拥有的代码更新主要帖子,这样你可以告诉我是否有办法让它更干净,或者我们是否应该到此为止。我建议你添加一些类型信息来给自己一些提示,因为类型混淆的原因可能在代码中的任何地方。很可能你有一个原始类型请注意,您的解决方案包含了对
集合
的可能昂贵的哈希运算,可能需要更多的临时内存。您的原始代码可以与
javac
以及
ClassificationData
FeatureData
的适当声明配合使用您没有显示的
,有问题,或者您使用的是Eclipse,它有时在类型推断方面有问题。@Holger我使用的是Oracle Java 8。
ClassificationData
FeatureData
都是自动生成的DTO,所以我不能对它们做太多工作。使用的字段是
集合分类;
d
Collection features;
这就是我试图用另一个线程中过于简单的Car示例来描述的问题,您已经对此做出了响应。您可能无法更改自动生成的类,但知道确切的签名可能有助于我们找出您第一次尝试失败的原因。如前所述,对于直接声明,它起作用了,所以一定有区别…
toCollection(LinkedHashSet::new)