在不使用flatMap的情况下实现flatMap效果

Oge*_*gen 0 java java-stream

我有这个定义开发人员的类.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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"));
Run Code Online (Sandbox Code Playgroud)

现在我想提取一套集体技能.我是这样使用的flatMap:

 Set<String> skills = developers.stream().flatMap(dev -> dev.skills.stream()).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

有没有办法通过Streams而不使用flatMap

Log*_*ain 6

编辑

由于文档说明,因此无需在收集器内部使用线程安全结构:

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


flatMap是要走的路.知道你问题背后的动机会很高兴.

实现相同结果的另一种方法是使用收集器(如其他答案所述).您还可以避免map将所有内容放入收集器中:

Set<String> skills = developers.stream()
    .collect(
        HashSet<String>::new, 
        (acum, dev) -> acum.addAll(dev.skills), 
        Set::addAll
    );
Run Code Online (Sandbox Code Playgroud)