이런 Scala의 장점을 Java에서 사용하기 위해서 단순한 작업 두 가지만 해주면, Scala 의 강력한 자료구조를 쉽게 사용할 수 있습니다.
첫째는 maven으로 java와 scala 코드를 동시에 빌드할 수 있는 환경을 만드는 것이고,
둘째는 Java 자료구조와 Scala 자료구조를 쉽게 변환할 수 있도록 하는 것입니다.
첫째는 링크를 따라가시면 쉽게 환경을 구성할 수 있으니 생략하구요,
자료구조의 변환에 대한 코드만 보여드리겠습니다.
물론 제가 만든 게 아니라 Scala 에서 기본 제공하는 JavaConversions 라는 Object 를 사용하는 것입니다.
Java2Scala Object 를 보시면 모든 메소드가 implicit 로 정의되어 있습니다. 암묵 변환(implicit conversion) 이 되서, 개발자는 Object 를 import 하는 것으로 끝납니다.
Java2Scala.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import collection.{mutable, JavaConversions} | |
/** | |
* Java 자료구조 (Iterable, Iterator, List, Set, Map)와 Scala 자료구조 (Iterable, Iterator, List, Set, Map) 를 | |
* 암묵적(implicit)하게 변환해줍니다. | |
* 사용 시 import kr.hconnect.core.collections.Java2Scala._ 를 해주시면 됩니다. | |
* | |
* @author 배성혁 sunghyouk.bae@gmail.com | |
* @since 13. 6. 27. 오후 1:43 | |
*/ | |
object Java2Scala { | |
implicit | |
def javaIterable2ScalaIterable[T](iterable: java.lang.Iterable[T]): Iterable[T] = | |
JavaConversions.iterableAsScalaIterable[T](iterable) | |
implicit | |
def javaIterator2ScalaIterator[T](iterator: java.util.Iterator[T]): Iterator[T] = | |
JavaConversions.asScalaIterator(iterator) | |
implicit | |
def javaList2ScalaBuffer[T](list: java.util.List[T]): mutable.Buffer[T] = | |
JavaConversions.asScalaBuffer[T](list) | |
implicit | |
def javaSet2ScalaSet[T](set: java.util.Set[T]): mutable.Set[T] = | |
JavaConversions.asScalaSet[T](set) | |
implicit | |
def javaMap2ScalaMap[K, V](javaMap: java.util.Map[K, V]): mutable.Map[K, V] = | |
JavaConversions.mapAsScalaMap[K, V](javaMap) | |
implicit | |
def scalaIterable2JavaIterable[T](iterable: collection.Iterable[T]): java.lang.Iterable[T] = | |
JavaConversions.asJavaIterable[T](iterable) | |
implicit | |
def scalaIterator2JavaIterator[T](iterator: collection.Iterator[T]): java.util.Iterator[T] = | |
JavaConversions.asJavaIterator[T](iterator) | |
implicit | |
def scalaBuffer2JavaList[T](buffer: collection.mutable.Buffer[T]): java.util.List[T] = | |
JavaConversions.bufferAsJavaList[T](buffer) | |
implicit | |
def scalaBuffer2JavaList[T](seq: collection.Seq[T]): java.util.List[T] = | |
JavaConversions.seqAsJavaList[T](seq) | |
implicit | |
def scalaBuffer2JavaList[T](mutableSeq: collection.mutable.Seq[T]): java.util.List[T] = | |
JavaConversions.mutableSeqAsJavaList[T](mutableSeq) | |
implicit | |
def scalaSetToJavaSet[T](set: collection.Set[T]): java.util.Set[T] = | |
JavaConversions.setAsJavaSet(set) | |
implicit | |
def scalaBuffer2JavaList[T](mutableSet: collection.mutable.Set[T]): java.util.Set[T] = | |
JavaConversions.mutableSetAsJavaSet(mutableSet) | |
implicit | |
def scalaMapToJavaMap[K, V](map: collection.Map[K, V]): java.util.Map[K, V] = | |
JavaConversions.mapAsJavaMap[K, V](map) | |
} |
java 코드에서 scala 메소드를 사용할 때, java 의 list 나 set 을 전달하면, 알아서 scala 의 ArrayBuffer 나 HashSet으로 변환하여 작업한 후 결과도 java 의 자료구조 형식으로 변환합니다.
scala 의 implicit 기능을 사용하면 엄청난 유연성이 생깁니다.
댓글 없음:
댓글 쓰기