Я хочу, чтобы получить лучшее понимание того, что на самом деле происходит в этом коде при конвертировании из Java List
к родовому Scala Seq
:Scala: Возвращение изменяемый буфер из функции, которая возвращает Seq
import scala.collection.JavaConverters._
def foo(javaList: java.util.List[String]): Seq[String] = {
val scalaMutableBuffer: mutable.Buffer[String] = javaList.asScala
scalaMutableBuffer
}
...
val bar = foo(someJavaList)
Я правильно понимаю, что, хотя bar
вводится как Seq[String]
, он использует изменяемый буфер на базовом уровне, потенциально влияя на производительность операций Seq? Является ли Seq просто ссылкой на буфер через ограничения Seq-признака или существует фактическое основное преобразование, которое продолжается? Было бы лучше подумать о значении bar
содержит как изменчивое или неизменяемое?
Простите, насколько открытым этот вопрос, но я не чувствую, что у меня есть хорошее представление о том, что происходит, и я бы хотел изменить это. Например, были ли бы случаи, когда было бы предпочтительнее для меня преобразовать scalaMutableBuffer
toList
перед возвратом с foo
?
Спасибо!
Имеет смысл, спасибо за ответ! У меня есть реакция кишки против изменчивости в Scala, но реалистично неизменность - это абстракция поверх множества подходов к JVM-модификации - и похоже, что Seq обеспечивает эту абстракцию неизменности даже в этом случае. – Nathan
@Nathan Я понимаю ваше чувство кишки. Когда вы работаете с Scala, вы хотите стремиться к неизменности на всем пути. Но опять же, нужно было бы усердно работать над абстракцией «Seq» в вашем случае и фактически использовать изменчивость изменчивой коллекции. –
Из любопытства, если я назвал 'bar.asInstanceOf [scala.collection.mutable.Buffer [String]]', будет ли он делать общее преобразование из Seq в изменяемый буфер с использованием интерфейса Seq или будет пытаться с использованием базового двоичного представления? – Nathan