Scala: подсказка типа для лямбда

Я обновляю скалу. Это выглядит очень просто для меня, но я не могу заставить его работать:

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. Очень признателен

Какая у вас версия Scala? Какая у вас версия Java?

Dmytro Mitin 05.02.2023 14:47

А также, пожалуйста, покажите свой файл сборки (build.sbt?). Особенно scalacOptions.

Dmytro Mitin 05.02.2023 14:51

Что-то изменится для вас, если вы укажете .map[File]((_: Path).toFile)?

Dmytro Mitin 05.02.2023 15:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обратите внимание, что Files.walk возвращает Java Stream, поэтому map и forEach взяты из Java.

Предполагая, что вы используете Scala 2.12, ваш код будет работать, если вы:

  1. Обновите версию Scala до 2.13 (в этом случае никаких других изменений вносить не нужно)
  2. Укажите тип возврата map:
Files.walk(dir).map[File](_.toFile).forEach(println)
  1. Преобразование в коллекции Scala перед вызовом map:
import scala.collection.JavaConverters._
Files.walk(dir).iterator().asScala.map(_.toFile).foreach(println)

Прохладный. Так вроде 2.12

Dmytro Mitin 05.02.2023 15:20

Kolmar, спасибо за объяснение: я как-то предполагал, что этапы потоков Scala будут применяться напрямую... но, как вы объясняете, я применял преобразования из потоков Java!

diegoruizbarbero 05.02.2023 15:29

@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) компилируется.

Dmytro Mitin 06.02.2023 04:16

Другие вопросы по теме