Scala支持与Java的隐式转换
2016-05-17 22:15
495 查看
Scala中操作Java集合
两种情况需要在Scala中操作Java集合。一种是Scala调用了其他的Java库,针对Java集合需要转换为Scala集合,如此才能享受Scala集合提供的福利;另一种是编写了Scala程序,但需要提供给Java库,为了更好地无缝集成,要让Java库体会不到Scala的存在。
Scala调用Java库
我在编写spark批量导入mongodb的程序中,用到伪代码:
这时编译会报miss parameter type for expanded function, the argument types of an anonymous function must be fully known(SLS 8.5)
经过查阅资料,才知道导入该包:需要进行隐式转换
import scala.collection.JavaConversions._
Scala的代码以Java库的形式提供给Java调用者
在JVM平台下进行多语言开发时,多数情况下会以Java为主,而对于一些特定场景,能够更好发挥Scala特性的,例如并发处理等,则会选择Scala。此时,若要做到对Java友好,则对于Scala的方法返回值,应尽量屏蔽Scala的类型信息。
Java中操作Scala集合
Java要调用Scala代码,而不幸的,这个需要调用的Scala代码不够体贴,直接返回了Scala的集合类型。由于Java不提供自定义隐式转换的功能,因此,只能调用Scala提供的转换类进行显式转换。例如Scala中的XmlConfigure类,其readSoftInfos()返回的是Scala的Seq:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
public class XmlConfigureJavaTest {
@Test
public void should_load_xml_file() {
XmlConfigure xmlConfigure = new XmlConfigure();
List softInfos = JavaConversions.asJavaList(xmlConfigure.readSoftInfos(“/config.xml”, “version number”));
assertThat(softInfos.size(), is(7));
}
}
在readSoftInfos()函数返回的为Scala集合类型的情况下,若不进行显示转换,则无法通过编译。
Scala的隐式转换
Scala对Java集合与Scala集合之间的互相转换都用到了Scala提供的隐式转换功能。我们导入的JavaConversions就是承担这种转换的一个Facade Object。它扩展了两个trait:WrapAsScala和WrapAsJava。在JavaConversions对象中定义的方法实际上是将请求委派自它继承的trait的隐式转换函数。例如将Seq转换为java的List:
def asJavaList[A](b : Seq[A]): ju.List[A] = seqAsJavaListA
}
seqAsJavaList就是定义在WrapAsJava中的隐式转换函数。在这个函数中又作了一个模式匹配。如果匹配JListWrapper,则调用传入的wrapped参数的asInstanseOf进行类型转换;否则,就将该seq作为参数传递给包装器SeqWrapper。包装器SeqWrapper是Scala定义的样例类(case class),扩展自Java的AbstractList
两种情况需要在Scala中操作Java集合。一种是Scala调用了其他的Java库,针对Java集合需要转换为Scala集合,如此才能享受Scala集合提供的福利;另一种是编写了Scala程序,但需要提供给Java库,为了更好地无缝集成,要让Java库体会不到Scala的存在。
Scala调用Java库
我在编写spark批量导入mongodb的程序中,用到伪代码:
val client : MongoClient = new MongoClient("192.168.1.150") val findIterable:FindIterable[Document] = client.getDatabase("test").getCollection("test").find( new BasicDBObject("id","791279468")) for( doc:Document <- findIterable ){ }
这时编译会报miss parameter type for expanded function, the argument types of an anonymous function must be fully known(SLS 8.5)
经过查阅资料,才知道导入该包:需要进行隐式转换
import scala.collection.JavaConversions._
Scala的代码以Java库的形式提供给Java调用者
在JVM平台下进行多语言开发时,多数情况下会以Java为主,而对于一些特定场景,能够更好发挥Scala特性的,例如并发处理等,则会选择Scala。此时,若要做到对Java友好,则对于Scala的方法返回值,应尽量屏蔽Scala的类型信息。
Java中操作Scala集合
Java要调用Scala代码,而不幸的,这个需要调用的Scala代码不够体贴,直接返回了Scala的集合类型。由于Java不提供自定义隐式转换的功能,因此,只能调用Scala提供的转换类进行显式转换。例如Scala中的XmlConfigure类,其readSoftInfos()返回的是Scala的Seq:
import scala.collection.JavaConversions;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
public class XmlConfigureJavaTest {
@Test
public void should_load_xml_file() {
XmlConfigure xmlConfigure = new XmlConfigure();
List softInfos = JavaConversions.asJavaList(xmlConfigure.readSoftInfos(“/config.xml”, “version number”));
assertThat(softInfos.size(), is(7));
}
}
在readSoftInfos()函数返回的为Scala集合类型的情况下,若不进行显示转换,则无法通过编译。
Scala的隐式转换
Scala对Java集合与Scala集合之间的互相转换都用到了Scala提供的隐式转换功能。我们导入的JavaConversions就是承担这种转换的一个Facade Object。它扩展了两个trait:WrapAsScala和WrapAsJava。在JavaConversions对象中定义的方法实际上是将请求委派自它继承的trait的隐式转换函数。例如将Seq转换为java的List:
object JavaConversions extends WrapAsScala with WrapAsJava {
def asJavaList[A](b : Seq[A]): ju.List[A] = seqAsJavaListA
}
seqAsJavaList就是定义在WrapAsJava中的隐式转换函数。在这个函数中又作了一个模式匹配。如果匹配JListWrapper,则调用传入的wrapped参数的asInstanseOf进行类型转换;否则,就将该seq作为参数传递给包装器SeqWrapper。包装器SeqWrapper是Scala定义的样例类(case class),扩展自Java的AbstractList
相关文章推荐
- JAVA第六次作业
- spring统一管理异常和访问日志
- eclipse怎么修改工作空间路径
- Java基础第八天听课总结(2)--多线程&Thread
- Java基础 - 强引用、弱引用、软引用、虚引用
- JDK1.8 源码 中的设计模式
- Java之static与final关键字
- JDK1.8源码中的设计模式
- 从头开始,学习Java Web
- eclipse 运行Maven时报错总结
- Java并发编程:Callable、Future和FutureTask
- Spring Mvc那点事---(7)Spring Mvc @Autowired注解
- SDK (Manager)及 API JDK下载安装处理——ADT 的添加——AVD 的创建;
- java中的字符串
- eclipse build path功能总 结
- Java中只有值传递,没有引用传递
- Java-动态代理技术
- java多线程知识点收集-总
- eclipse运行时报errors occurred during the build. errors running builder "android package builder" on pro
- Java之enumeration(枚举)