如何将List <scala.tuple2>转换为java.util.HashMap?

时间:2016-09-22 19:02:45

标签: apache-spark java-8

我正在使用Spark。 在对scala.Tuple2<K,V>的RDD进行收集后的火花中,我得到了scala.Tuple2<K,V>的列表。我想将它转换为Java中的HashMap<K,V>

我可以遍历列表并将其添加到我的HashMap中,但我正在寻找一种优雅的方法来执行此操作。谢谢!

2 个答案:

答案 0 :(得分:3)

在Scala中你可以这样做:

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}

答案 1 :(得分: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"));异常发生:

  

线程“main”中的异常java.lang.IllegalStateException:Duplicate   第二关键   java.util.stream.Collectors.lambda $ throwingMerger $ 0(Collectors.java:133)     在java.util.HashMap.merge(HashMap.java:1253)

如果您不确定是否可以复制:

    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}