2016-09-22 7 views
1

私はSparkを使用しています。 scala.Tuple2<K,V>のRDDでコレクトをした後にスパークして、scala.Tuple2<K,V>のリストを取得します。私はそれをJavaのHashMap<K,V>に変換したいと思います。List <scala.Tuple2>をjava.util.HashMapに変換するにはどうすればよいですか?

リストを反復してHashMapに追加できますが、これを行うためのエレガントな方法を探しています。ありがとう!

あなたが行うことができますScalaで
+0

あなたはこのような何かをしたいですか? http://stackoverflow.com/a/33345553/4969370 – Androbin

答えて

1

私はのjavaで最もエレガントな方法はstreamCollectorsを使用することだと思います。あなたがこの方法を達成することができます

List<Tuple2<String, String>> list = new ArrayList<>(); 
    list.add(new Tuple2<>("first", "second")); 
    list.add(new Tuple2<>("third", "four")); 
    list.add(new Tuple2<>("five", "six")); 
    list.add(new Tuple2<>("seven", "eight")); 
    list.add(new Tuple2<>("nine", "ten")); 

    System.out.println("List of Tuple2s:" + list); 

    //convert list of tupples to Map with one line 
    Map<String, String> resultMap = list.stream() 
      .collect(Collectors.toMap(Tuple2::_1, Tuple2::_2)); 

    System.out.println("Map of Tuples2s: "+resultMap); 

出力:

List of Tuple2s:[(first,second), (third,four), (five,six), (seven,eight), (nine,ten)] 
    Map of Tuples2s: {nine=ten, third=four, seven=eight, five=six, first=second} 

しかし、どのような重複キーについて?我々はリストに別の項目を追加するときのように:list.add(new Tuple2<>("first", "ten"));例外がoccures:スレッドで

例外は、 "メイン" java.lang.IllegalStateException:( java.util.stream.Collectors.lambda $ throwingMerger $ 0 キーを2重複しますjava.util.HashMap.merge(HashMap.java:1253)

でCollectors.java:133) あなたはあなたが行うことができます重複を持つことができるかどうかわからない場合:

Map<String, String> resultMap = list.stream() 
      .collect(Collectors.toMap(Tuple2::_1, Tuple2::_2, 
        (x, y) -> { 
         System.out.println("duplicate key!"); 
         return x; 
        })); 

を入力し、項目を上書きすることは避けてください。Map

出力:

List of Tuple2s:[(first,second), (third,four), (five,six), (seven,eight), (nine,ten), (first,ten)] 
duplicate key! 
Map of Tuples2s: {nine=ten, third=four, seven=eight, five=six, first=second} 
2

scala> import scala.collection.JavaConverters._ 

scala> val tuples = List((1, 2), (2, 3), (4, 5)) 
scala> tuples.toMap.asJava 
res1: java.util.Map[Int,Int] = {1=2, 2=3, 4=5} 
+0

私は質問にjavaを言及しました。 –

関連する問題