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

时间:2016-10-16 17:05:46

标签: java collections java-8 java-stream

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

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)

我也试过Set :: add和Set :: 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 :(得分:3)

我认为你在第一个lambda中搞乱了参数的顺序;它应该是

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

...虽然坦率地说,只需用

替换整个收藏家创作就更好了
toCollection(LinkedHashSet::new)

这相当于。