代码之家  ›  专栏  ›  技术社区  ›  Sarah Messer

Jupyter Scala笔记本无法识别使用Java List的Scala匿名函数

  •  0
  • Sarah Messer  · 技术社区  · 6 年前

    我想我的Jupyter/Scala设置中有一些错误配置,但是我在诊断这个问题时遇到了很多问题。 下面是我试图运行的代码,通过一个新的docker映像(bikerx/bikerx)和一个新的内核:

    import java.util.Arrays
    var original = Arrays.asList("hello", "world", "war")
    original.stream().map(_.toUpperCase()).forEach(wat => println(wat))
    

    通过REPL可以很好地工作,但是当我运行Jupyter时,会出现以下错误:

    <console>:91: error: missing parameter type for expanded function ((x$1) => x$1.toUpperCase())
       original.stream().map(_.toUpperCase()).forEach(wat => println(wat))
    

    我也试着替换 _.toUpperCase() 具有 n => n.toUpperCase() ,但也有同样的错误。使用 (n:String) => n.toUpperCase() 给出相关错误:

    <console>:92: error: type mismatch;
    found   : String => String
    required: java.util.function.Function[_ >: String, _]
       original.stream().map((n:String) => n.toUpperCase()).forEach(wat => println(wat))
    

    跳过流也会失败:

    java.util.Arrays.asList("a", "b", "c").map(_.toUpperCase())
    

    产量

    <console>:89: error: value map is not a member of java.util.List[String]
       java.util.Arrays.asList("a", "b", "c").map(_.toUpperCase())
    

    以下是“帮助”选项卡中的“当前内核信息”:

    BeakerX 1.0.0
    Scala 2.11.12
    hash 99cb191
    build time 2018-07-05 19:22 UTC
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   TheSaltyBadger    6 年前

    如错误所示:“值映射不是java.util.List[String]的成员”,您不能将映射应用到java.util.List[String]

    您需要将java.util.List[String]转换为scala集合。

    添加以下内容:

    import scala.collection.JavaConversions._
    

    然后可以运行代码而不出错:

    java.util.Arrays.asList("a", "b", "c").map(_.toUpperCase())
    

    将产生以下结果:scala.collection.mutable.Buffer[String]=ArrayBuffer(A,B,C)

        2
  •  1
  •   Joe Pallas    6 年前

    这是因为您正在将REPL中Scala 2.12的行为与Jupyter笔记本中scala2.11的行为进行比较。Scala 2.12改进了Scala函数/lambdas与Java 8之间的兼容性 FunctionalInterface . 2.12编译器可以推断Java方法所期望的Scala函数类型,而2.11编译器不能。