Java 添加集合中所有项的最佳方法

Java 添加集合中所有项的最佳方法,java,collections,java-8,java-stream,collectors,Java,Collections,Java 8,Java Stream,Collectors,实现以下目标的最佳、最便宜、最高效的方法是什么: 我确实有一个对象的集合,它提供了一个返回一组整数的方法。我想将集合中的所有项目添加到新集合中 LinkedList<myObject> ll = new LinkedList<>(); //fill the list bla bla Set<Integer> result = ll.stream() .map(f -> f.getTheSet()) .flatMap(Set:

实现以下目标的最佳、最便宜、最高效的方法是什么:

我确实有一个对象的
集合
,它提供了一个返回一组整数的方法。我想将集合中的所有项目添加到新集合中

LinkedList<myObject>  ll = new LinkedList<>();

    //fill the list bla bla

Set<Integer> result = ll.stream()
    .map(f -> f.getTheSet())
    .flatMap(Set::stream)
    .collect(Collectors.toCollection(TreeSet::new));

System.out.println(result.toString());
LinkedList ll=new LinkedList();
//填写清单等等
Set result=ll.stream()
.map(f->f.getTheSet())
.flatMap(集合::流)
.collect(收集器.toCollection(TreeSet::new));
System.out.println(result.toString());
是否有更好的方法获得包含所有对象的所有整数的结果集?
我希望避免使用
flatMap
命令“解包集合”。相反,我想到的是类似于
.addAll
的东西,或者它最终是否无关紧要,因为
.addAll
无论如何都会解包?

您可以使用
addAll
进行收集,方法是:

Set result=ll.stream()
.map(MyObject::getTheSet)
.collect(HashSet::new,Set::addAll,Set::addAll);
HashSet::new
创建一个新容器,
Set::addAll
将每个集合添加到容器中,如果此流并行运行,则第二个
Set::addAll
合并两个容器

(如果您特别想要
TreeSet
,请使用
TreeSet::new

相反,我想的是像.addAll这样的东西,或者它最终是否无关紧要,因为.addAll还是解包了

TreeSet.addAll()
有一个优化的代码路径,用于添加实现
SortedSet
的集合(假设它们具有相同的排序顺序)

警告:这是一个未记录的实现细节,因此可能会发生更改


您自己只要查看JDK源代码就可以很容易地找到这些信息,它是。

有效的,但是您可以解释一下,使用
.collect(HashSet::new,Set::addAll,Set::addAll)
?我添加了一个简短的解释和一个指向3参数collect javadoc的链接。我想这比我能解释得更好。看看这对你来说是否有意义。注意:尽管此代码路径仅在添加到空的
树集时有效,因此它可能仅适用于第一个非空流元素。@TagirValeev对,但适用于并行流,这些并行流仍可能对所有叶任务产生影响。
Set<Integer> result = ll.stream()
        .map(MyObject::getTheSet)
        .collect(HashSet::new, Set::addAll, Set::addAll);