应用场景: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,不知道是否有更优方法?