2015-02-15 2 views
2

В случае Set или List выбор кажется более простым, но что мне делать для Java Collection, Iterable эквивалентно? Я иду за Seq? Traversable? GenTraversableOnce?Как выбрать тип коллекции для возврата в Scala?

+0

Какая у вас просьба? – SMA

+0

Это не заслуживает полного ответа, но стоит отметить, что вы можете вернуть экземпляр типа Iterable scala, как и в Java. –

ответ

3

Как часто, это будет зависеть от потребностей вашего абонента. Traversable довольно высокий уровень (вы получаете только foreach), но этого может быть достаточно. Seq будет использоваться, если вам нужен определенный порядок элементов. GenTraversableOnce будет немного абстрактным для меня и, возможно, для ваших коллег-кодеров.

4

Вам необходимо решить, исходя из ваших потребностей. Например: Согласно Scala Documentation определению последа является

последовательностей являются частными случаями Iterable коллекций класса Iterable. В отличие от итераций, последовательности всегда имеют определенный порядок элементов. Последовательности предоставляют метод для индексации.

Так что если вы хотите воспользоваться упорядоченностью или вы хотите, чтобы получить элемент по индексу вы можете использовать Seq

Опять же согласно Scala Documentation, если вы в основном заинтересованы в итерации над коллекцией Traversable достаточно

Просто обратите внимание на то, что для вашей функции-подписи, такой как функция возвращаемого типа, существует общая хорошая практика, используйте более общий (абстрактный) тип данных, чтобы предотвратить ненужное снижение производительности для вызывающих функцию функций.

+0

Не должны ли входные параметры быть как можно более абстрактными, а возвращаемое значение как можно более конкретным? – mucaho

+0

О параметрах Я согласен с вами. О типе возврата это действительно зависит. Например, представим функцию, принимающую два Traversable, и хочет их конкатенировать. Каким должен быть тип возврата? Я считаю Traversable. Таким образом, уровень абстракции возвращаемого типа в основном происходит из уровня абстракции параметра. В общем, вы можете быть конкретным в возвращаемом типе, только если у вас есть веская причина. Вы не должны вызывать ненужный штраф производительности вызывающему функции. Например, вам может быть удобнее использовать Seq, поэтому всегда возвращайте Seq в функции, управляющей коллекциями. Это не верно. – Nami

+0

«Вы не должны принуждать к ненужному штрафу за исполнение функции вызывающей функции». «Почему должно быть наказание за производительность, если вы указываете тип возврата более конкретным? Реализация не изменяет, является ли тип возврата 'Seq' или' GenTraversableOnce'. «Всегда возвращайте Seq в функции, управляющей коллекциями, неправильно» «Я вижу вашу точку здесь. – mucaho

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