2017-03-09 1 views
0

ここでは、2つの異なるリストを1つのマップに変換しています。私はこれを行うために通常のforループを使用する前に。今私はパフォーマンスの問題のためにストリームを使用しています。ストリームを使用する場合、両方のオブジェクトのリストに同じ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

で単一ストリームに2ストリームをCONCATことができますか?いくつのオブジェクトがありますか? – Kayaman

+0

それは千から百万のオブジェクトに変化します –

+0

あなたのメソッドにvarargsを受け入れ、両方のコレクションを1つのストリームに変換するためにflatMapを使用します。 –

答えて

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

関連する問題