scala - Scala 代码在 Intellij 上运行,但不在 Apache Zeppelin 笔记本上
问题描述
我开发了一些 scala 代码来迭代 java.util.ArrayList[Source],其中 Source 是具有两个字符串的案例类。
如果我在 IntelliJ 上运行我的代码,它会完美运行,当我把它放到我的 Zeppelin Notebook 上时,它会给我一个错误。
我的代码是:
source_list.forEach(s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)})
Apache Zeppelin 中的错误是:
<console>:45: error: missing parameter type
有人能告诉我为什么会这样吗?
解决方案
由于旧版本的 Java 没有 Lambda,旧版本的 Scala 有完全不同的Function
实现。
由于您使用forEach
的ArrayList
是在 Java 8 中添加的,这表明您已经在使用 Java 8 之后的 Java 版本。
在 Java 8 中引入 Lambda 之后,Scala 的后续版本都Function
基于 Java lambda 实现。
现在,您source_list
是一个java.util.ArrayList[Source]
,这意味着source_list.forEach
需要一个类型的参数,该参数Consumer<? super Source>
可以被 Java lambda 替换,例如(Source s) -> { }
.
您正在为它提供以下 scala 功能,
s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)
如果使用较新的 Scala 版本,则会将其编译为适当的 lambda,但对于较旧的 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))
此错误表明您的 Zeppelin 笔记本正在运行旧版本的 Scala(很可能是 2.11.x 甚至 2.10.x)
对于旧版本的 Scala,您必须显式创建Consumer
并将其传递给forEach
import java.util.ArrayList
import java.util.function.Consumer
val list = new ArrayList[Int]()
list.add(1)
val consumer: Consumer[Int] = new Consumer[Int] {
override def accept(i: Int): Unit = println(i)
}
list.forEach(consumer)
推荐阅读
- python - Python:Coinmarketcap API 关闭?
- vb.net - 按字母顺序对 csv 文件进行排序 Visual Basic
- java - spring boot parent 防止资源:resources
- javascript - 如何在 JSX div 的 id 中添加 if 条件?
- swift - 如何在功能字段中使用父级?
- database-design - sql中的存储技术
- hibernate - 如何用 JPA 和 hibernate 管理一个简单的博客表结构?
- python - 根据 ID 状态转换数据帧
- javascript - 检查数组是否为空时,我应该使用 array.length <= 0 还是 array.length === 0?
- sorting - 在记事本++中的某个字符之后对行进行排序