我正在学习Scala,我想在Scala中编写以下Java代码。
Java代码:
Files
.walk(Paths.get("R:\\scala"))
.filter(p-> isRegularFile(p))
.map(Path::getFileName)
.map(Path::toString)
.forEach(System.out::println);
我无法理解下面的Scala代码的以下错误消息。我应该改变什么?如果我使用_符号,我会收到更多错误:
Error:(12, 11) type mismatch;
found : java.util.function.Function[java.nio.file.Path,String]
required: java.util.function.Function[? >: ?0, ?]
Note: java.nio.file.Path <: ? >: ?0, but Java-defined trait Function is
invariant in type T.
You may wish to investigate a wildcard type such as `_ <: ? >: ?0`. (SLS 3.2.10)
.map(new java.util.function.Function[Path, String]() {
Scala代码:
Files
.walk(Paths.get("R:\\scala"))
.filter(isRegularFile(_))
.map(new java.util.function.Function[Path,Path](){
def apply(p:Path): Path = p.getFileName
})
.map(new java.util.function.Function[Path,String](){
def apply(p:Path):String = p.toString
})
.forEach(println(_))
答案 0 :(得分:2)
在这种情况下,Scala很难推断类型(很想听听智能人比我更好的原因)。同时,您可以通过使用类型提示注释.map
方法来帮助Scala编译器:
Files
.walk(Paths.get("R:\\scala"))
.filter(isRegularFile(_))
.map[Path](new java.util.function.Function[Path,Path](){
def apply(p:Path): Path = p.getFileName
})
.map[String](new java.util.function.Function[Path,String](){
def apply(p:Path):String = p.toString
})
.forEach(println(_))
顺便说一句,如果您使用的是Scala 2.12,那么您可以使用单个抽象方法替换java.util.function.Function
,使您的代码看起来像:
Files
.walk(Paths.get("R:\\scala"))
.filter(isRegularFile(_))
.map[Path]((p: Path) => p.getFileName)
.map[String]((p: Path) => p.toString)
.forEach(println(_))