2017-02-15 48 views
5

[k1, v1, k2, v2] gibi bir listeyi {k1: v1, k2: v2} gibi bir haritaya dönüştürmek istiyorum. Orijinal kod şudur:java8 akış stili?

List<Object> params = Arrays.asList("k1", "v1", "k2", "v2"); 
Map<String, Object> map = new HashMap<>(); 
for(int i = 0; i < params.size(); i+=2) { 
    String key = (String)params.get(i); 
    Object value = params.get(i + 1); 
    map.put(key, value); 
} 
System.out.println(map); // => {k1=v1, k2=v2} 

Daha sonra java8 akış stiline dönüştürmek istiyorum? Nasıl?

+0

Bu dönüşümün amacı nedir? Sadece çalışma için – Andrew

+0

. @AndrewTobilko – Run

+2

[StreamEx] (http://amaembo.github.io/streamex/javadoc/one/util/streamex/EntryStream.html#ofPairs-java.util) gibi çok daha kolay hale getirecek bazı kütüphaneler vardır. List-) –

cevap

2

Bunu kullanabilirsiniz, ancak açıkçası, for döngüsünüz çok daha okunabilir. İlk etapta böyle bir liste üretmekten kaçınmaya çalışacağım ve List<SomePair> yerine SomePair anahtar ve değeri içerecektir.

List<Object> params = Arrays.asList("k1", "v1", "k2", "v2"); 
    Map<String, Object> map = 
     IntStream.range(0, params.size()/2) 
       .collect(HashMap::new, 
          (m, i) -> m.put((String) params.get(i * 2), params.get(i * 2 + 1)), 
          HashMap::putAll); 

    System.out.println(map); // => {k1=v1, k2=v2} 
+2

Alternatif olarak 'collectors.toMap' kullanabilirsiniz, eğer 'kutulu' ilk:' .boxed() ile boru alırsanız toplayın (Collectors.toMap (i -> (String) params.get (i * 2), i -> params.get (i * 2 + 1))) –

2

Alternatif Stream kullanmadan, sadece iyi bir eski Iterator kullanmak ve bir sonraki eleman almak için next diyebiliriz. Tabii ki, listede çift sayıda eleman yoksa bu başarısız olur.

Map<String, Object> map = new HashMap<>(); 
Iterator<Object> iter = params.iterator(); 
iter.forEachRemaining(x -> map.put((String) x, iter.next())); 
+0

Teşekkür ederim, küçük bir kesmek. – Run