2013-11-16 6 views
0

Мне было интересно, что это лучший способ создать объекты List.Создать список объектов с красивым

То, что я был в состоянии придумать либо преобразования использованную Range в List:

val objs: List[String] = 
    for (i <- 1.to(100).toList) 
    yield new String("" + i) 

или конвертировать весь результат остроумие toList:

val objs: List[String] = 
    (for (i <- 1 to 100) 
    yield new String("" + i)).toList 

Но ни один из них не выглядит гладкой достаточно для меня. Есть ли более простой способ сделать это? Переменная должна быть типа List, потому что она используется в другом месте кода, с которым я играю. Заранее спасибо!

ответ

6

Вы можете просто использовать toList прямо на Range.

(1 to 100).toList 

Чтобы преобразовать Ints в строки, просто использовать toString и отобразить его в диапазоне:

(1 to 100).map(_.toString).toList 

Далее, ваше использование new String("" + i) действительно излишним. Выражение "" + iуже a String, поэтому вы фактически создаете новую строку из существующей строки. Поэтому вы должны просто использовать существующую строку!

Если вы действительно любите "" + i синтаксис лучше, чем toString, вы должны по крайней мере сделать это:

(1 to 100).map("" + _).toList 


EDIT: Основываясь на ваш комментарий о действительно хочет избавиться от звонок toList, вы можете использовать breakOut. Это работает, глядя на ожидаемый тип (указанный в левой части знака равенства здесь) и непосредственно создавая такую ​​коллекцию. Преимуществом является то, что он избегает создания промежуточной коллекции (от map) до создания List, но это уродливее.

val xs: List[String] = (1 to 100).map(_.toString)(breakOut) 

или, если вы хотели "" + _ синтаксис

val xs: List[String] = (1 to 100).map("" + _)(breakOut) 

или с для/выход, как вы изначально хотели:

val xs: List[String] = (for(i <- 1 to 100) yield "" + i)(breakOut) 
+0

Ok, ТНХ. Я явно хотел использовать 'for', но карта для меня тоже классная. Теперь я вижу, что нельзя исключить вызов 'toList'. Обратите внимание, что я использовал 'String' только как тип объекта-заглушки с помощью простого конструктора, который принимает идентификатор. – rlegendi

Смежные вопросы