gpt4 book ai didi

Scala 代码在 Intellij 上运行,但不在 Apache Zeppelin notebook 上运行

转载 作者:行者123 更新时间:2023-12-01 15:00:17 24 4
gpt4 key购买 nike

我开发了一些 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实现。

由于您使用的是 forEachArrayList Java 8中添加的,说明你已经在使用高于Java 8的Java版本。

在 Java 8 中引入 Lambda 之后,Scala 的后续版本有了它们的 Function基于 Java lambda 的实现。

现在,你 source_listjava.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 代码在 Intellij 上运行,但不在 Apache Zeppelin notebook 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57179237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com