Jupyter Scala 笔记本无法使用 Java 列表识别 Scala 匿名函数
Jupyter Scala notebook not recognizing Scala anonymous function using Java List
我想我的 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) => x.toUpperCase())
original.stream().map(_.toUpperCase()).forEach(wat => println(wat))
我也试过用n => n.toUpperCase()
替换_.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())
这是“帮助”选项卡中的"current kernel information":
BeakerX 1.0.0
Scala 2.11.12
hash 99cb191
build time 2018-07-05 19:22 UTC
如错误提示:"value map is not a member of 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)
这是因为您将 REPL 中 Scala 2.12 的行为与 Jupyter notebook 中 Scala 2.11 的行为进行比较。 Scala 2.12 改进了 Scala functions/lambdas 和 Java 8 的 FunctionalInterface
之间的兼容性。 2.12 编译器可以推断出 Java 方法期望的 Scala 函数类型,而 2.11 编译器则不能。
我想我的 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) => x.toUpperCase())
original.stream().map(_.toUpperCase()).forEach(wat => println(wat))
我也试过用n => n.toUpperCase()
替换_.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())
这是“帮助”选项卡中的"current kernel information":
BeakerX 1.0.0
Scala 2.11.12
hash 99cb191
build time 2018-07-05 19:22 UTC
如错误提示:"value map is not a member of 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)
这是因为您将 REPL 中 Scala 2.12 的行为与 Jupyter notebook 中 Scala 2.11 的行为进行比较。 Scala 2.12 改进了 Scala functions/lambdas 和 Java 8 的 FunctionalInterface
之间的兼容性。 2.12 编译器可以推断出 Java 方法期望的 Scala 函数类型,而 2.11 编译器则不能。