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

时间:2015-08-10 23:35:21

标签: java collections java-8 java-stream collectors

实现以下目标的最佳,最便宜,最佳性能的方法是什么:

我有一个Collection个对象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无论如何都会解包?

2 个答案:

答案 0 :(得分:9)

您可以使用addAll收集Set<Integer> result = ll.stream() .map(MyObject::getTheSet) .collect(HashSet::new, Set::addAll, Set::addAll);

HashSet::new

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

(如果您特别需要TreeSet

,请使用 public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }

答案 1 :(得分:1)

  

相反,我想到像.addAll这样的东西或最终无所谓,因为.addAll无论如何解包?

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

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

您可以通过查看JDK源代码included in the src.zip shipped with the JDK轻松找到此信息。