【问题标题】:Scala code running on Intellij, but not on Apache Zeppelin notebookScala 代码在 Intellij 上运行,但不在 Apache Zeppelin 笔记本上
【发布时间】:2019-12-02 09:21:57
【问题描述】:

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

谁能告诉我为什么会这样?

【问题讨论】:

    标签: scala intellij-idea apache-zeppelin


    【解决方案1】:

    由于旧版本的 Java 没有 Lambda,旧版本的 Scala 有一个完全不同的 Function 实现。

    由于您在 ArrayList 上使用的是 Java 8 中添加的 forEach,这表明您已经在使用 Java 8 之后的 Java 版本。

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

    现在,您的source_listjava.util.ArrayList[Source],这意味着source_list.forEach 需要一个Consumer&lt;? super Source&gt; 类型的参数,该参数可以被Java lambda 替换,例如(Source s) -&gt; { }

    您正在为它提供以下 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)
    

    【讨论】:

    • 谢谢@Sarvesh
    猜你喜欢
    • 2018-12-05
    • 2022-11-17
    • 2017-03-11
    • 1970-01-01
    • 2011-01-18
    • 2018-05-08
    • 2018-12-20
    • 2017-01-29
    • 2020-03-05
    相关资源
    最近更新 更多