복붙노트

[SCALA] 스칼라지도 자바지도로 변환

SCALA

스칼라지도 자바지도로 변환

나는 자바지도를 가지고 : java.util.Map > 내가 스칼라지도로 변환하고 싶습니다 : 맵 [SomeObject의, 세트 [OtherObject]

내가 mapAsScalaMap을 사용했지만 결과는 내가 원하는 꽤 것이 아니다, 결과는 다음과 같습니다 맵 [SomeObject의, java.util.Collection이 [OtherObject]. 어떻게 또한 세트에 컬렉션을 변환 해결할 수 있습니까?

참고 : 실제로 내 원래의 문제는 Multimap과 [SomeObject의, OtherObject]에 구글의 ArrayListMultimap 을 변환했지만 이것이 가능하지 때부터의 한 문제를 분할합니다. 원래 문제에 대한 해결책을 가지고 있다면, 나는 또한 대답으로 그것을 받아 들일 것이다.

해결법

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

    1.편집 : 권장되는 방법이 사용 JavaConverters과 .asScala 방법에 지금이다 :

    편집 : 권장되는 방법이 사용 JavaConverters과 .asScala 방법에 지금이다 :

    import scala.collection.JavaConverters._
    val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)
    

    깨끗하고 consise 머물면서이, 마법의 암시 적 변환하지만 .asScala에 대한 명시 적 호출을 사용하지 않는 장점이있다.

    JavaConversions와 원래의 대답 :

    당신은 암시 적으로 자바와 스칼라 사이의 변환 scala.collection.JavaConversions을 사용할 수 있습니다 :

    import scala.collection.JavaConversions._
    val myScalaMap = myJavaMap.mapValues(_.toSet)
    

    호출 mapValues는 스칼라지도에 자바지도에서 암시 적 변환을 트리거, 다음으로 자바 컬렉션 toSet를 호출 암시 적으로 스칼라 컬렉션에 다음 세트로 변환합니다.

    기본적으로는 변경 가능한 맵을 돌려, 당신은 추가 .toMap와 불변의 하나를 얻을 수 있습니다.

    짧은 틱 예 :

    scala> val a: java.util.Map[String, java.util.Collection[String]] = new java.util.HashMap[String, java.util.Collection[String]]
    a: java.util.Map[String,java.util.Collection[String]] = {}
    
    scala> val b = new java.util.ArrayList[String]
    b: java.util.ArrayList[String] = []
    
    scala> b.add("hi")
    res5: Boolean = true
    
    scala> a.put("a", b)
    res6: java.util.Collection[String] = []
    
    scala> import scala.collection.JavaConversions._
    import scala.collection.JavaConversions._
    
    scala> val c = a.mapValues(_.toSet)
    c: scala.collection.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi))
    
    scala> c.toMap
    res7: scala.collection.immutable.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi))
    
  2. ==============================

    2.불변의지도 myJavaMap.asScala.toMap

    불변의지도 myJavaMap.asScala.toMap

    변경 가능한지도 myJavaMap.asScala

  3. ==============================

    3.당신은 자바에서이 작업을 수행해야하는 경우 :

    당신은 자바에서이 작업을 수행해야하는 경우 :

    List<Tuple2<A, B>> tuples = javaMap.entrySet().stream()
                .map(e -> Tuple2.apply(e.getKey(), e.getValue()))
                .collect(Collectors.toList());
    
    scala.collection.Map scalaMap = scala.collection.Map$.MODULE$.apply(JavaConversions.asScalaBuffer(tuples).toSeq());
    

    기준 자료 : https://stackoverflow.com/a/45373345/5209935

  4. ==============================

    4.당신은 아래의 기능을 사용하여 스칼라지도에 Java 맵을 변환 할 수 있습니다 :

    당신은 아래의 기능을 사용하여 스칼라지도에 Java 맵을 변환 할 수 있습니다 :

    val scalaMap = javaMap.asScala;
    

    이것을 사용하기 위해 당신은 가져 오기 scala.collection.JavaConverters._ 라이브러리를 가져와야합니다.

    희망이 도움이됩니다.

  5. from https://stackoverflow.com/questions/16918956/convert-java-map-to-scala-map by cc-by-sa and MIT license