Я пришел из Groovy, и у него есть метод .with
для каждого типа, который принимает закрытие с одним аргументом; аргумент - это объект, для которого вызывается метод .with
. Это позволяет использовать очень классную технику расширения функциональных возможностей цепочки, которая освобождает вас от необходимости вводить временные переменные, учитывает ваш код, облегчает чтение и выполняет другие тонкости.
Я хочу иметь возможность сделать что-то вроде этого:
Seq(1, 2, 3, 4, 5)
.filter(_ % 2 == 0)
.with(it => if (!it.isEmpty) println(it))
Вместо
val yetAnotherMeaninglessNameForTemporaryVariable =
Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
if (!yetAnotherMeaninglessNameForTemporaryVariable.isEmpty)
println(yetAnotherMeaninglessNameForTemporaryVariable)
Другими словами, в первом примере .with
в некотором роде похож на .foreach
, но вместо итерации по элементам объекта он вызывается один раз для самого объекта. Так что it
равно Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
.
Так как я был очень удивлен, не обнаружив ничего подобного в Scala, мои вопросы:
- я что-то упустил?
- есть ли альтернативные методы, родные для Scala?
- если нет, есть ли веские причины, по которым эта функция не реализована в Scala?
Обновление:
Соответствующий запрос был опубликован в системе отслеживания проблем Scala: https://issues.scala -lang.org / browse / SI-5324 . Пожалуйста, проголосуйте и рекламируйте