2017-02-15 11 views
5

[k1、v1、k2、v2]のようなリストを{k1:v1、k2:v2}のようなマップに変換したいと考えています。元のコードは:キー値リストをマップに変換するjava8ストリームスタイル?

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} 

次に私はそれをjava8ストリーム形式に変換したいですか?どうやって?

+0

この変換の目的は何ですか? – Andrew

+0

@AndrewTobilko – Run

+2

な[StreamEx](http://amaembo.github.io/streamex/javadoc/one/util/streamex/EntryStream.html#ofPairs-java.utilとして、これははるかに簡単になるだろういくつかのライブラリがあります。リスト - ) –

答えて

2

あなたはこれを使用することができますが、率直に言って、あなたのforループは、はるかに読みやすいです。最初にそのようなリストを作成しないようにして、代わりにList<SomePair>を持っています。SomePairにはキーと値が含まれています。 Streamを使用する代わりに

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

が好きで、あなたはboxed'最初 'をごパイプ場合' Collectors.toMap'を使用することができます。 - >(文字列) ')(.boxed(Collectors.toMap(I集めますparams.get(i * 2)、i - > params.get(i * 2 + 1))) ' –

2

、あなたはちょうど良い古いIteratorを使用して、次の要素を取得するためにnextを呼び出すことができます。もちろん、リストに偶数の要素がない場合、これは失敗します。

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

ありがとう、少しハックします。 – Run

関連する問題