2014-10-23 4 views
1

Я застрял с преобразованиями данных в Java-8 ...преобразование Map <Integer, Double> к <Iterable Tuple2 <Integer, Double >>

Кто-нибудь знает, как превратить Map<Integer, Double> в Iterable<Tuple2<Integer, Double>>, или даже Map.Entry<Integer, Double> до Tuple2<Integer, Double>?

Спасибо!

+0

Что такое Tuple2? – Eran

+0

Это двухэлементный кортеж. – dimson

ответ

1

A Map<> имеет метод Set<Map.Entry<K, V>> entrySet(). Это дает вам Set записей, которые вы можете перебрать.

Если вы хотите перебрать более Tuple2<Integer, Double> объектов, вам необходимо преобразовать Entry объектов. Для этого вы можете e. г. превратить ваш Set в Stream:

Шаг за шагом:

Stream<Entry<Integer, Double>> myEntryStream = myMap.entrySet().stream(); 
Stream<Tuple2<Integer, Double>> myTuple2Stream = myEntryStream.map(entry -> new Tuple2(entry.getKey(), entry.getValue())); 

или просто

Stream<Tuple2<Integer, Double>> myStream = myMap.entrySet().stream().map(entry -> new Tuple2(entry.getKey(), entry.getValue())); 

Чтобы перебрать это, вы можете сделать

Iterable<Tuple2<Integer, Double>> it = myStream::iterator; 

или просто

for (Tuple2<Integer, Double> item: (Iterable<Tuple2<Integer, Double>>) myStream::iterator) { 
    // do sth with item 
} 

Если ваш Tuple2 бы это ни было, есть конструктор, который принимает Map.Entry, вы можете даже сделать

.map(Tuple2::new) 

для того, чтобы достичь своей цели.

+0

Thanx Man! Вы действительно помогли! – dimson

+3

Преобразование потока обратно в 'Iterable' не очень удобно, если вы хотите выполнить действие в стиле цикла' for', проще использовать 'myMap.forEach ((ключ, значение) ->/* ваш код с использованием ключа и значения * /}); 'который может даже использовать класс' Tuple' устаревшим. – Holger

+0

Holger - Нет, я использую функцию, которая получает параметр «Итерируемый» в качестве параметра. – dimson

 Смежные вопросы

  • Нет связанных вопросов^_^