Intellij 上的 Scala 代码 运行,但 Apache Zeppelin notebook 上没有
Scala code running on Intellij, but not on Apache Zeppelin notebook
我开发了一些 scala 代码来迭代 java.util.ArrayList[Source],其中 Source 是一个 class 有两个字符串的案例。
如果我 运行 我的代码在 IntelliJ 上,它 运行 完美,当我把它放到我的 Zeppelin 笔记本上时它给我一个错误。
我的代码是:
source_list.forEach(s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)})
Apache Zeppelin 中的错误是:
<console>:45: error: missing parameter type
谁能告诉我为什么会这样?
由于旧版本的 Java 没有 Lambda,旧版本的 Scala 有一个完全不同的 Function
实现。
由于您在 ArrayList
上使用 Java 8 中添加的 forEach
,这表明您已经在使用 Java 晚于 [=42] 的版本=] 8.
在 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)
我开发了一些 scala 代码来迭代 java.util.ArrayList[Source],其中 Source 是一个 class 有两个字符串的案例。
如果我 运行 我的代码在 IntelliJ 上,它 运行 完美,当我把它放到我的 Zeppelin 笔记本上时它给我一个错误。
我的代码是:
source_list.forEach(s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)})
Apache Zeppelin 中的错误是:
<console>:45: error: missing parameter type
谁能告诉我为什么会这样?
由于旧版本的 Java 没有 Lambda,旧版本的 Scala 有一个完全不同的 Function
实现。
由于您在 ArrayList
上使用 Java 8 中添加的 forEach
,这表明您已经在使用 Java 晚于 [=42] 的版本=] 8.
在 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)