实现以下目标的最佳,最便宜,最佳性能的方法是什么:
我有一个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
无论如何都会解包?
答案 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轻松找到此信息。