【发布时间】:2017-03-09 11:48:33
【问题描述】:
在这里,我将两个不同的列表转换为一个地图。在我使用正常的 for 循环来执行此操作之前。由于性能问题,现在我正在使用流。使用流时如何为两个对象列表使用相同的 mapObject。
final Set<Object1> objects1 = new HashSet<Object1>();
final Set<Object2> objects2 = new HashSet<Object2>();
final Map<Id, Object> objectMap = new HashMap<Id, Object>();
private void addObjectsToMap(Map<Id, Object> objectMap, final Collection<? extends Object> objects)
{
// used this operation earlier to convert
for (final Object object : objects)
{
objectMap.put(object.getId(), object);
}
// using this one now
objectMap = objects.parallelStream().collect(
Collectors.toMap(object -> object.getId(), object -> object));
}
addObjectsToMap(objectMap, objects1);
addObjectsToMap(objectMap, objects2);
【问题讨论】:
-
您在正常循环时遇到了性能问题?你有多少个对象?
-
从千到百万不等
-
在您的方法中接受可变参数并使用 flatMap 将两个集合转换为一个流应该可以工作
-
您现在所拥有的是您正在创建完全不同的地图,您不会收集到您在方法内部传递的地图。此外,使用并行流不会提高性能 - 您只会在更多工作人员之间分散负载并引入并行化开销。
-
是否有一些魔法使
Object拥有getId()方法?
标签: java java-8 hashmap java-stream