我已经开发了一些scala代码来迭代java.util.ArrayList [Source],其中Source是带有两个String的case类。
如果我在IntelliJ上运行我的代码,它可以完美运行,当我将其下载到Zeppelin Notebook时,它会给我一个错误。
我的代码是:
source_list.forEach(s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)})
Apache Zeppelin中的错误是:
<console>:45: error: missing parameter type
有人可以告诉我为什么会这样吗?
答案 0 :(得分:0)
由于Java的较早版本没有Lambda,因此Scala的较早版本具有完全不同的Function
实现。
由于您是在Java 8中添加的forEach
上使用ArrayList
,因此表明您已经在使用Java版本,而不是Java 8。
在Java 8中引入Lambda以后,Scala的更高版本具有基于Java lambda的Function
实现。
现在,您source_list
是一个java.util.ArrayList[Source]
,这意味着source_list.forEach
期望使用类型为Consumer<? super Source>
的参数,该参数可以用Java lambda代替,例如{{1} }。
您正在为其提供以下scala功能,
(Source s) -> { }
在使用新的Scala版本时,它会编译为适当的lambda,但在旧的scala版本中会失败。
s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)
此错误表明您的Zeppelin笔记本正在运行旧版本的Scala(很可能是2.11.x甚至是2.10.x)
使用旧版本的Scala,您必须显式创建// this will work with Scala 2.12.x but fail with older versions
import java.util.ArrayList
val list = new ArrayList[Int]()
list.add(1)
list.forEach(i => println(i))
并将其传递给Consumer
forEach