应用场景:scala那边做数据处理,java这边接收返回数据做逻辑处理。现在scala那边需要将得到的数据封装到一个List里面,在java那边创建一个对应Object的javabean,接收传回来的List模型,进行解析处理。
先上javabean:
package javabean;
import java.util.ArrayList;
import java.util.List;
import com.github.katjahahn.parser.sections.idata.NameImport;
import com.github.katjahahn.parser.sections.idata.OrdinalImport;
public class ImportInfo {
private String importDLLName;
private List<String> importFunNameList;
public ImportInfo() {
super();
}
public ImportInfo(String importDLLName, List<String> importFunNameList) {
super();
this.importDLLName = importDLLName;
this.importFunNameList = importFunNameList;
}
public String getImportDLLName() {
return importDLLName;
}
public void setImportDLLName(String importDLLName) {
this.importDLLName = importDLLName;
}
public List<String> getImportFunNameList() {
return importFunNameList;
}
public void setImportFunNameList(List<String> importFunNameList) {
this.importFunNameList = importFunNameList;
}
}
再上scala的数据封装类:
def importsModel: java.util.List[ImportInfo] = {
val importDLLList = ListBuffer[ImportInfo]().asJava
val loader = new SectionLoader(data)
val maybeImports = loader.maybeLoadImportSection()
if (maybeImports.isPresent && !maybeImports.get.isEmpty) {
val idata = maybeImports.get
val imports = idata.getImports.asScala
for (im <- imports) {
val ImportInfo = new ImportInfo()
ImportInfo.setImportDLLName(im.getName)
val importFunNameList = ListBuffer[String]().asJava
val importsDllFun = im.getNameImports.asScala
// importFunNameList.clear()
for (ni <- importsDllFun) {
importFunNameList.add(ni.getName)
}
ImportInfo.setImportFunNameList(importFunNameList)
importDLLList.add(ImportInfo)
}
} else ""
importDLLList
}
这样就实现了scala返回List<Object>给java。本例是改项目需要参考一个开源项目,这个开源项目里面穿插着用了scala和java,我对scala不熟悉,也并不知道为何不全在java里面做,而是要穿插着scala,所以在实现一个scala返回List<Object>给java也折腾了半天。另外,在折腾过程中遇到几点问题,我先记下来,如果有哪位大神知道,恳请执教:
Q2.为何要scala和java穿插用,是scala处理数据能力比java更佳吗?
Q1.通常有碰到两层循环需要其中一个List在内存循环完做一次清空的情况,java里面的List有clear()方法,但我在scala里面采用的ListBuffer[ImportInfo]().asJava,在clear以后就把所有之前存的也一并清空了,我换成List[ImportInfo]().asJava又抛出不支持的数据处理异常,最后不得已采用循环里面实例化ListBuffer,不知道是否有更优方法?