2015-12-29 2 views
-7

После выполнения операции итерирования через мою хэш-карту, как показано ниже, мой Hashmap mMusicListByGenre становится пустым.Почему итерация через мой Hashmap делает его пустым?

Hashmap<String,List<mediametadata>> mMusicListByGenre 
... 
List<MediaMetadata> newlist=new ArrayList<MediaMetadata>(); 
      Iterator it = mMusicListByGenre.entrySet().iterator(); 
      while (it.hasNext()) { 
       Map.Entry pair = (Map.Entry)it.next(); 
       System.out.println(pair.getKey() + " = " + pair.getValue()); 
       newlist.addAll((List<MediaMetadata>) pair.getValue()); 
       it.remove(); // avoids a ConcurrentModificationException 
      } 

Есть ли способ, чтобы перебирать без опорожнения мой HashMap (mMusicListByGenre)? Мне нужно снова перестроить hashmap, который становится неэффективным.

+13

Что вы думаете 'it.remove();' делает? – azurefrog

+0

Я ожидаю, что он будет пустым. Вы удаляете элемент после продвижения итератора. – Makoto

+1

@azurefrog ... Кроме того, избегая «ConcurrentModificationException», то есть? – dasblinkenlight

ответ

1

Вы можете удалить it.remove(), если вы не хотите удалять все записи. Более простым решением является сделать следующее.

Map<String,List<MediaMetadata>> mMusicListByGenre = ... 
List<MediaMetadata> list = mMusicListByGenre.values() 
              .flatMap(List::stream) 
              .collect(Collectors.toList());