首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用flatMap实现flatMap效果

不使用flatMap实现flatMap效果
EN

Stack Overflow用户
提问于 2016-10-23 13:44:29
回答 3查看 113关注 0票数 0

我有一个定义开发者的类。

代码语言:javascript
复制
class Developer {
    private final String name;
    Set<String> skills = new HashSet<>();

    public Developer(final String name, final String... skills) {
        this.name = name;
        for (final String skill : skills) {
            this.skills.add(skill);
        }
    }
}

我正在创建一个开发人员列表。

代码语言:javascript
复制
List<Developer> developers = new ArrayList<>();
people.add(new Developer("Bill", "Javascript", "HTML", "CSS"));
people.add(new Developer("Bob", "Java", "OOP", "Agile"));
people.add(new Developer("Barry", "Data Mining", "Machine Learning", "R"));

现在,我想提取一组集体技能。我使用flatMap完成此操作,如下所示:

代码语言:javascript
复制
 Set<String> skills = developers.stream().flatMap(dev -> dev.skills.stream()).collect(Collectors.toSet());

有没有办法在不使用flatMap的情况下通过Stream实现这一点呢?

EN

回答 3

Stack Overflow用户

发布于 2016-10-23 14:25:50

编辑

不需要在收集器中使用线程安全结构,因为the documentation说:

当并行执行时,可以实例化、填充和合并多个中间结果,以便保持可变数据结构的隔离。因此,即使与非线程安全的数据结构(如ArrayList)并行执行,也不需要额外的同步来进行并行减少。

flatMap是最好的选择。如果能知道你问题背后的动机,那就太好了。

另一种实现相同结果的方法是使用collectors (正如其他答案中所述)。您也可以避免使用map,而将所有内容放在收集器中,如下所示:

代码语言:javascript
复制
Set<String> skills = developers.stream()
    .collect(
        HashSet<String>::new, 
        (acum, dev) -> acum.addAll(dev.skills), 
        Set::addAll
    );
票数 6
EN

Stack Overflow用户

发布于 2016-10-23 14:23:31

您可以使用带有supplieraccumulatorcombiner参数的重载版本的Collectors.collect

代码语言:javascript
复制
Set<String> skills = developers.stream().map(Developer::getSkills)
                               .collect(HashSet::new, Set::addAll, Set::addAll);
System.out.println("Skills :: " + skills);

输出

代码语言:javascript
复制
Skills :: [Java, OOP, CSS, R, Javascript, Agile, Data Mining, HTML, Machine Learning]
票数 3
EN

Stack Overflow用户

发布于 2016-10-23 14:41:48

您可以像这样使用reduce

代码语言:javascript
复制
Set<String> set = people.stream()
    .map(d -> d.skills)
    .reduce(new HashSet<String>(),
        (map, list) -> { map.addAll(list); return map; });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40199958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档