2017-03-09 58 views
0

這裏我將兩個不同的列表轉換爲單個映射。之前我使用正常的循環來做到這一點。由於性能問題,現在我正在使用流。如何在使用流時爲對象列表使用同一個mapObject。使用Java 8流時更新現有的Map對象

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

你有*性能問題*在普通的循環?你有多少物品? – Kayaman

+0

它從千變量到百萬個對象 –

+0

在你的方法中接受可變參數,並使用flatMap將兩個集合轉換爲一個流應該工作 –

回答

2

可以Concat的2流爲單流與物流的concat

Map<Integer, Object> objectMap; 
objectMap = Stream.concat(objects1.stream(), objects2.stream()) 
        .parallel() 
        .collect(Collectors.toMap(Object::getId, Function.identity())); 
+0

或'Stream.of(objects1,objects2).flatMap(List :: stream)' – shmosel