Jupyter Scala笔记本无法使用Java列表识别Scala匿名功能

时间:2018-08-03 14:59:48

标签: java scala jupyter-notebook anonymous-function

我认为我在Jupyter / Scala设置中配置不正确,但是在诊断问题时遇到很多麻烦。 这是我尝试通过新的docker映像(beakerx / beakerx)和新内核运行的代码:

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 个答案:

答案 0 :(得分:1)

错误提示:“值映射不是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)

答案 1 :(得分:1)

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