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);