【问题标题】:How to convert List<scala.Tuple2> to java.util.HashMap?如何将 List<scala.Tuple2> 转换为 java.util.HashMap?
【发布时间】:2016-09-22 19:02:45
【问题描述】:

我正在使用 Spark。 在对scala.Tuple2&lt;K,V&gt; 的 RDD 进行收集后,我得到了scala.Tuple2&lt;K,V&gt; 的列表。我想在 Java 中将其转换为 HashMap&lt;K,V&gt;

我可以遍历列表并将其添加到我的 HashMap,但我正在寻找一种优雅的方式来做到这一点。谢谢!

【问题讨论】:

标签: apache-spark java-8


【解决方案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&lt;&gt;("first", "ten")); 发生异常:

线程“主”java.lang.IllegalStateException 中的异常:重复 关键秒在 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}

【讨论】:

    【解决方案2】:

    在 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}
    

    【讨论】:

    • 我在问题中提到了java。
    猜你喜欢
    • 2014-09-25
    • 2012-08-07
    • 2020-11-27
    • 1970-01-01
    • 2018-12-27
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多