Я обновляю скалу. Это выглядит очень просто для меня, но я не могу заставить его работать:
import java.nio.file.{FileSystems, Files}
object ScalaHello extends App {
val dir = FileSystems.getDefault.getPath("/home/intelli/workspace")
Files.walk(dir).map(_.toFile).forEach(println)
}
Выдает ошибку при отображении лямбда:
argument expression's type is not compatible with formal parameter type;
found : java.util.function.Function[java.nio.file.Path,java.io.File]
required: java.util.function.Function[_ >: java.nio.file.Path, _ <: ?R]
Я подозреваю, что это как-то связано с предоставлением подсказок типа для лямбды, но я не могу ничего найти в Google. Очень признателен
А также, пожалуйста, покажите свой файл сборки (build.sbt
?). Особенно scalacOptions
.
Что-то изменится для вас, если вы укажете .map[File]((_: Path).toFile)
?
Обратите внимание, что Files.walk
возвращает Java Stream
, поэтому map
и forEach
взяты из Java.
Предполагая, что вы используете Scala 2.12, ваш код будет работать, если вы:
map
:Files.walk(dir).map[File](_.toFile).forEach(println)
map
:import scala.collection.JavaConverters._
Files.walk(dir).iterator().asScala.map(_.toFile).foreach(println)
Прохладный. Так вроде 2.12
Kolmar, спасибо за объяснение: я как-то предполагал, что этапы потоков Scala будут применяться напрямую... но, как вы объясняете, я применял преобразования из потоков Java!
@Kolmar «2.13 (в этом случае нет необходимости вносить какие-либо другие изменения)». Кажется, иногда это зависит от scalacOptions
. С -Ydelambdafy:inline
.forEach(println)
не компилируется в 2.13 (class type required but java.util.function.Consumer[_ >: java.io.File] found
), а .forEach(println(_))
компилируется. С -Ydelambdafy:method
(по умолчанию) .forEach(println)
компилируется.
Какая у вас версия Scala? Какая у вас версия Java?