2012-08-10 24 views
14

में मैप मेरे जावा कोड से कुछ स्कैला लाइब्रेरी का उपयोग कर रहा हूं। और मुझे संग्रह के साथ एक समस्या है। मुझे विधि के पैरामीटर के रूप में scala.collection.immutable.Map पास करने की आवश्यकता है। मैं अपने जावा कोड से immutable.Map को परिवर्तित या निर्माण कर सकता हूं लेकिन मुझे नहीं पता कि यह कैसे करें। सुझाव?java.util.HashMap को scala.collection.immutable में कनवर्ट करें। जावा

उत्तर

0

क्या आप एक अतिरिक्त एपीआई कॉल प्रदान कर सकते हैं जो JavaConverters का उपयोग करके java.util.Map को परिवर्तित/प्रदान करता है?

class Example { 
    import scala.collection.JavaConverters._ 
    def fromMap(m:Map[...]) = ... 

    // generics etc. elided 
    def fromJava(m:java.util.Map) = { 
     fromMap(m.asScala.toMap) 
    } 
} 

आप रूपांतरण निकालने और (विशेष रूप से के रूप में मैं ध्यान दें कि आप एक स्काला पुस्तकालय के लिए काम कर रहे हैं) एक डेकोरेटर भी प्रदान कर सकते। नोट dhg की टिप्पणी फिर से। अचल स्थिति।

17

यह जावा में 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; 
    } 
} 

हम दिखा सकते हैं कि इस स्काला आरईपीएल से काम करता है:

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) 

लेकिन निश्चित रूप से आप जावा कोड से इन विधियों को आसानी से कॉल कर सकते हैं।

+5

कोई "toMap" विधि किसी भी अधिक है। उपरोक्त कोड जावा 1.7 और स्कैला 2.11 :( –

+10

जेडीके 1.8 के लिए संकलित नहीं किया जा सकता है, यह दिखाता है "स्कैला का उपयोग नहीं कर सकता। प्रीफिफ़। $ कम $ कोलन $ कम" त्रुटि – Freedom

0

यह जावा 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); 
} 
1

जावा 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); 
} 
संबंधित मुद्दे