3

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

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

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

有没有更好的方法来获取包含来自所有对象的所有整数的结果集?我想避免使用flatMap命令“解包”。相反,我会考虑类似.addAll的事情,或者它最终是否无关紧要,因为.addAll无论如何都会解包?

4

2 回答 2

12

addAll您可以使用3-argumentcollect收集:

Set<Integer> result = ll.stream()
        .map(MyObject::getTheSet)
        .collect(HashSet::new, Set::addAll, Set::addAll);

HashSet::new创建一个新容器,Set::addAll将每个集合添加到容器中,Set::addAll如果要并行运行此流,则第二次合并两个容器。

(或者TreeSet::new如果你特别想要一个使用TreeSet

于 2015-08-11T00:13:48.507 回答
1

相反,我会考虑类似 .addAll 的东西,或者它最终是否无关紧要,因为 .addAll 无论如何都会解包?

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

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

只需查看 JDK 源代码,您就可以很容易地自己找到这些信息,该源代码包含在 JDK 附带的 src.zip 中

于 2015-08-11T08:37:32.323 回答