У меня есть список Chicken
с и Egg
с, которые я хочу создать. Они определены как:
class Chicken (val name: String, e: => Egg) { lazy val child = e }
class Egg (val name: String, c: => Chicken) { lazy val parent = c }
и одна пара должна создаваться лениво, потому что они содержат циклические ссылки:
def fillBarn {
lazy val chicken: Chicken = new Chicken("abc", egg)
lazy val egg: Egg = new Egg("def", chicken)
}
У меня есть список куриных / яичных имен, которые я хочу создать. К сожалению, следующее не компилируется:
val names = List("C1 E1", "C2 E2", "C3 E3")
val list = for {
Array(cn, en) <- names.map(_.split(" "))
lazy c: Chicken = new Chicken(cn, e)
lazy e: Egg = new Egg(en, c)
} yield (c, e)
но без сахара:
val list = names.map(_.split(" ")).map {
case Array(cn, en) =>
lazy val c: Chicken = new Chicken(cn, e)
lazy val e: Egg = new Egg(en, c)
(c, e)
}
Теперь, возможно, в этом простом случае лучше без for-expression, но если бы я действительно хотел использовать for-expression, могу ли я?
Я также понимаю, что в этом тривиальном случае я мог бы создать экземпляры Chicken
и Egg
в блоке yield
, но в общем случае это не будет так, скажем, если бы я хотел выполнить дополнительную фильтрацию и отображение на основании экземпляров.