Пусть у меня есть эти классы: Foo(id: String)
и Bar(fooId: String)
Scala: вызов функции, чтобы проверить, если значение существует, если нет, то создать и добавить в список раза
У меня есть список Foo
объектов, я хочу, чтобы создать список из Bar
объектов в соответствии с ID в Foo
объектов. Если в списке существует панель, я не хочу, чтобы ее снова создавали и добавляли в список. Я могу использовать Set для решения этой проблемы, но мне это не нравится. Это просто неправильно.
def createBars() = {
var barList = List[Bar]()
for {
f ← fooList
bar = findOrCreateBar(f, barList)
barList = barList:+bar //error
} yield bar
}
def findOrCreateBar(f: Foo, barList: List[Bar]): Bar = {
barList match {
case Nil ⇒
Bar(f.id)
case _ ⇒
val bars = for {
bar ← barList
if f.id == bar.id
} yield bar
if (bars.isEmpty) {
Bar(f.id)
} else {
bars.head
}
}
}
У меня есть несколько вопросов:
первого код выше не работает, потому что я получаю ошибку компиляции в barList:+bar
в createBars
. :+
невозможно решить! Также компилятор говорит, что var
для объявления barList
может быть val! Таким образом, кажется, что компилятор не видит barList в barList = barList:+bar
как список!
второй Если я заменю вар из barList ВАЛ Я не могу переназначить измененный список barList
третьего Я использую для понимания в createBars
, потому что я думал, что у меня есть нет другого выбора, чтобы вернуть barList. Использование аннотаций и т. Д. Только для разрыва в регулярной петле-петле - не очень хорошая идея, imho!
Пожалуйста, помогите!
Как вы возражаете против использования набора? – dhg
@dhg в принципе, я думаю, что использование Set в этой ситуации было бы полезно для управления симптомом, но не для решения проблемы, а именно: не создавать и добавлять один и тот же объект повторно. И я действительно хочу сделать код, который я написал, используя список. – mnish