복붙노트

[SCALA] 자바 scala.collection.immutable.Map에 java.util.HashMap에 변환

SCALA

자바 scala.collection.immutable.Map에 java.util.HashMap에 변환

내 자바 코드에서 일부 스칼라 라이브러리를 사용하고 있습니다. 그리고 컬렉션에 문제가 있습니다. 나는 방법의 매개 변수로 scala.collection.immutable.Map을 통과해야합니다. 나는 변환하거나 내 자바 코드에서 immutable.Map를 구축하지만 난 그것을하는 방법을 모른다 할 수 있습니다. 제안?

해결법

  1. ==============================

    1.그것은 코드가 통해 뛰어 추가 농구 단지 부부 자바 JavaConverters을 사용하는 것이 완전히 가능합니다 :

    그것은 코드가 통해 뛰어 추가 농구 단지 부부 자바 JavaConverters을 사용하는 것이 완전히 가능합니다 :

    import java.util.HashMap;
    import scala.Predef;
    import scala.Tuple2;
    import scala.collection.JavaConverters;
    import scala.collection.immutable.Map;
    
    public class ToScalaExample {
      public static <A, B> Map<A, B> toScalaMap(HashMap<A, B> m) {
        return JavaConverters.mapAsScalaMapConverter(m).asScala().toMap(
          Predef.<Tuple2<A, B>>conforms()
        );
      }
    
      public static HashMap<String, String> example() {
        HashMap<String, String> m = new HashMap<String, String>();
        m.put("a", "A");
        m.put("b", "B");
        m.put("c", "C");
        return m;
      }
    }
    

    이 스칼라 REPL에서 작동하는지 우리가 보여줄 수 :

    scala> val jm: java.util.HashMap[String, String] = ToScalaExample.example
    jm: java.util.HashMap[String,String] = {b=B, c=C, a=A}
    
    scala> val sm: Map[String, String] = ToScalaExample.toScalaMap(jm)
    sm: Map[String,String] = Map(b -> B, c -> C, a -> A)
    

    그러나 물론 당신은 쉽게 Java 코드에서 이러한 메서드를 호출 할 수 있습니다.

  2. ==============================

    2.이것은 자바 1.8 스칼라 2.12와 나를 위해 일한 :

    이것은 자바 1.8 스칼라 2.12와 나를 위해 일한 :

    public static <K, V> scala.collection.immutable.Map<K, V> toScalaImmutableMap(java.util.Map<K, V> jmap) {
        List<Tuple2<K, V>> tuples = jmap.entrySet()
          .stream()
          .map(e -> Tuple2.apply(e.getKey(), e.getValue()))
          .collect(Collectors.toList());
    
        Seq<Tuple2<K, V>> scalaSeq = JavaConverters.asScalaBuffer(tuples).toSeq();
    
        return (Map<K, V>) Map$.MODULE$.apply(scalaSeq);
    }
    
  3. ==============================

    3.자바 1.7 스칼라 2.11에 대한 내 솔루션 :

    자바 1.7 스칼라 2.11에 대한 내 솔루션 :

    @SuppressWarnings("unchecked")
    private static <K, V> scala.collection.immutable.Map<K, V> toScalaImmutableMap(java.util.Map<K, V> javaMap) {
        final java.util.List<scala.Tuple2<K, V>> list = new java.util.ArrayList<>(javaMap.size());
        for (final java.util.Map.Entry<K, V> entry : javaMap.entrySet()) {
            list.add(scala.Tuple2.apply(entry.getKey(), entry.getValue()));
        }
        final scala.collection.Seq<Tuple2<K, V>> seq = scala.collection.JavaConverters.asScalaBufferConverter(list).asScala().toSeq();
        return (scala.collection.immutable.Map<K, V>) scala.collection.immutable.Map$.MODULE$.apply(seq);
    }
    
  4. ==============================

    4.당신은 소요 추가 API 호출 /되고있는 java.util.Map가 JavaConverters를 사용하여 변환을 제공을 제공 할 수 있습니까?

    당신은 소요 추가 API 호출 /되고있는 java.util.Map가 JavaConverters를 사용하여 변환을 제공을 제공 할 수 있습니까?

    class Example {
       import scala.collection.JavaConverters._
       def fromMap(m:Map[...]) = ...
    
       // generics etc. elided
       def fromJava(m:java.util.Map) = {
          fromMap(m.asScala.toMap)
       }
    }
    

    당신은 변환을 추출하고 (나는 당신에게 스칼라 라이브러리 수있는 좋은 방법입니다 작업에주의 특히) 데코레이터를 제공 할 수도 있습니다. 참고 DHG의 코멘트를 다시. 불변성.

  5. from https://stackoverflow.com/questions/11903167/convert-java-util-hashmap-to-scala-collection-immutable-map-in-java by cc-by-sa and MIT license