Коллекции Scala 2.13

  1. Под капотом: чистая земля
  2. Жизнь без CanBuildFrom
  3. Новый и достойный внимания
  4. groupMap
  5. Iterable - лучший тип коллекции
  6. LazyList предпочтительнее потока
  7. Операции вставки и удаления недоступны в общих коллекциях
  8. Резюме

Среда 13 июня 2018

Жюльен Ричард-Фой

Еще одна статья о стандартных коллекциях, правда? Действительно, за последние 18 месяцев была проделана большая работа в области коллекций, и мы опубликовали несколько статей в блогах и дали несколько выступлений, чтобы объяснить различные изменения или проблемы, с которыми мы столкнулись. Эта статья суммирует, что собирается измениться с точки зрения конечного пользователя .

Если вы внимательно следите за нашими предыдущими постами и беседами в блоге, вы можете не многому научиться из этой статьи. В противном случае, это прекрасная возможность наверстать упущенное за несколько минут!

В следующем разделе представлены изменения, которые являются внутренними для реализации коллекций, но могут оказать некоторое видимое влияние на поверхность. Затем я покажу, почему я считаю, что удаление CanBuildFrom сделало API более удобным для начинающих. Далее я представлю некоторые новые операции, доступные в коллекциях. Наконец, я упомяну основные недостатки, мотивы, стоящие за ними, и их рекомендуемые замены.

Под капотом: чистая земля

Под капотом: чистая земля

Наиболее важным изменением в новой структуре коллекций является то, что операции преобразования (такие как карта или фильтр) теперь реализованы таким образом, что работают как со строгими коллекциями (такими как List), так и со строгими коллекциями (такими как Stream). Это изменение, потому что раньше такого не было. Действительно, предыдущие реализации были строгими (они охотно оценивали элементы коллекции) и должны были быть переопределены нестрогими типами коллекции. Вы можете найти более подробную информацию об этом в этот блог ,

Хорошая новость заключается в том, что новый дизайн более корректен в том смысле, что теперь вы можете реализовывать пользовательские нестрогие типы коллекций, не беспокоясь о повторной реализации множества операций. (Некоторые операции, тем не менее, все еще охотно оценивают элементы коллекции (например, groupBy) и будут четко задокументированы.) Еще одним преимуществом является то, что операции преобразования определяются вне коллекций (как в cvogt / Scala-расширения Project) теперь работают с нестрогими коллекциями (такими как View или Stream).

Говоря о нестрогих коллекциях, тип View был переработан, и представления должны вести себя более предсказуемо. Кроме того, Stream не рекомендуется в пользу LazyList (см. Последний раздел).

Жизнь без CanBuildFrom

Я думаю, что наиболее заметным изменением для конечных пользователей является то, что операции преобразования больше не используют CanBuildFrom. Я считаю, что это будет вполне заметно, несмотря на наши предыдущие попытки скрыть CanBuildFrom от документации API коллекций. Действительно, если вы посмотрите на старый 2.12 Список API подпись, показанная для операции сопоставления, не упоминает CanBuildFrom:

Однако, если вы используете эту операцию в своем коде, тогда ваша IDE показывает свою фактическую подпись:

Как видите, сигнатура типа, показанная в документации API, была «упрощена», чтобы сделать ее более доступной, но я полагаю, что это, вероятно, вводит пользователей в заблуждение. Особенно, когда вы смотрите на TreeMap [A, B] API :

Этот тип подписи не имеет смысла: тип результата не может быть TreeMap [B], поскольку TreeMap принимает два параметра типа (тип ключей и тип значений). Кроме того, функция f фактически принимает в качестве параметра пару ключ-значение, а не просто ключ (как неправильно указано типом A).

CanBuildFrom использовался по уважительным причинам, в частности, тип, показанный на приведенном выше снимке экрана, был вычислен в соответствии с типом исходной коллекции и типом элементов новой коллекции. Случай TreeMap убедителен: если вы преобразуете пары ключ-значение в другие пары ключ-значение, для которых тип ключей имеет неявный экземпляр Ordering, тогда map возвращает TreeMap, но если такого экземпляра Ordering не существует, тогда лучший тип коллекции, который может быть возвращен, это Карта. И если вы преобразуете пары ключ-значение во что-то, что даже не является парой, тогда лучшим типом коллекции, который может быть возвращен, является Iterable. Эти три случая были поддержаны единственной реализацией операции, и CanBuildFrom использовался для абстрагирования по различным возможным типам возвращаемых данных.

В новых коллекциях мы хотели иметь более простые сигнатуры типов, чтобы мы могли отображать их фактическую сигнатуру в документации API, и автозаполнение, предоставляемое IDE, не страшно. Мы достигаем этого, используя перегрузку, как описано более подробно в эта статья блога ,

На практике это означает, что новый TreeMap имеет три перегрузки операции сопоставления:

На практике это означает, что новый TreeMap имеет три перегрузки операции сопоставления:

Эти сигнатуры типов являются фактическими, и они по сути переводят «в типах» то, что я написал выше о возможных типах результата карты в соответствии с типом элементов, возвращаемых функцией преобразования f. Мы считаем, что новый API проще для понимания.

Новый и достойный внимания

Мы ввели несколько новых операций. В следующих разделах представлены некоторые из них.

groupMap

Обычный шаблон со старыми коллекциями 2.12 состоит в использовании groupBy, за которым следует mapValues, для преобразования групп. Например, вот как мы можем индексировать имена пользователей по возрасту:

case class User (name: String, age: Int) def namesByAge (users: Seq [User]): Map [Int, Seq [String]] = пользователи. groupBy (_. age). mapValues ​​(users => users. map (_. name))

В этом коде есть тонкость. Статический тип возврата - Map, но фактически возвращаемая реализация Map является ленивой и оценивает свои элементы каждый раз, когда ее обходят (т.е. функция users => users.map (_. Name) оценивается каждый раз, когда просматривается карта).

В новых коллекциях типом возвращаемого значения mapValues ​​является MapView, а не Map, чтобы четко указывать, что его содержимое оценивается каждый раз при его обходе.

Кроме того, мы ввели операцию с именем groupMap, которая объединяет элементы в группы и преобразует группы. Приведенный выше код можно переписать следующим образом, чтобы воспользоваться преимуществами groupMap:

def namesByAge (users: Seq [User]): Map [Int, Seq [String]] = users.groupMap (_. age) (_. name)

Возвращенная карта является строгой: она с готовностью оценивает свои элементы один раз. Кроме того, тот факт, что он реализован как одна операция, позволяет применять некоторые оптимизации, которые делают его в ~ 1,3 раза быстрее, чем версия, использующая mapValues.

Изменяемые коллекции имеют несколько новых операций для преобразования своих элементов на месте: вместо возврата новой коллекции (как это делают map и filter), они изменяют исходную коллекцию. К этим операциям добавляется InPlace. Например, чтобы удалить пользователей, чьи имена начинаются с буквы J из буфера, а затем увеличивать их возраст, теперь можно написать:

val users = ArrayBuffer (…) пользователи. filterInPlace (пользователь =>! пользователь. имя. начинается с ("J")). mapInPlace (пользователь => пользователь. копия (возраст = пользователь. возраст + 1))

Следствием очистки и упрощения структуры коллекций является то, что несколько типов или операций устарели в Scala 2.13 и будут удалены в 2.14.

Iterable - лучший тип коллекции

Нам показалось, что проводить различия между Traversable и Iterable не стоит, поэтому мы удалили Traversable (теперь это псевдоним Iterable [A]).

Iterable [A] теперь является типом коллекции на вершине иерархии. Его единственный абстрактный член - это def iterator: Iterator [A].

LazyList предпочтительнее потока

Поток устарел в пользу LazyList. Как следует из его названия, LazyList - это связанный список, элементы которого лениво оцениваются. Важное семантическое различие с Stream в том, что в LazyList голова и хвост ленивы, тогда как в Stream только хвост ленив.

Операции вставки и удаления недоступны в общих коллекциях

В старой платформе 2.12 тип scala.collection.Map имеет операции + и - для добавления и удаления записей. Семантика этих операций заключается в возвращении новой коллекции с добавленными или удаленными записями без изменения исходной коллекции.

Эти операции затем наследуются изменяемой ветвью коллекций. Но изменяемые типы коллекций также вводят свои собственные операции вставки и удаления, а именно + = и - =, которые изменяют исходную коллекцию на месте. Это означает, что тип scala.collection.mutable.Map имеет + и + =, а также - и - =.

Наличие всех этих операций может быть полезно в некоторых случаях, но также может привести к путанице. Если вы хотите использовать + или -, то вы, вероятно, хотели бы использовать неизменяемый тип коллекции в первую очередь ... Следовательно, +, - и обновленный были перемещены из scala.collection.Map в scala.collection.immutable.Map, и + и - были перемещены из scala.collection.Set в scala.collection.immutable.Set

Мы думаем, что, отказавшись от этих операций вставки и удаления из универсальных типов коллекций и имея различные операции между изменяемыми и неизменяемыми ветвями, мы проясним ситуацию.

Резюме

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

  • нестрогие коллекции (такие как представления) безопаснее в использовании и проще в реализации,
  • Сигнатуры типов операций преобразования (таких как map) проще (без неявного параметра CanBuildFrom),
  • добавлены новые классные операции,
  • иерархия типов более проста (не прослеживается),
  • изменяемые типы коллекций не наследуют неизменные операции вставки и удаления.

Похожие

Круглосуточная поддержка: новый NOC и служба технической поддержки?
... ие недели я слышал от поставщика программного обеспечения, который идет к 24-часовой поддержке VAR и поставщиков управляемых услуг. Это заставило меня задуматься: а является ли круглосуточная поддержка новой нормой для партнеров по программному обеспечению и MSP, которые предлагают услуги службы поддержки и NOC (центры сетевых операций)? Вот некоторые идеи.
Обзор Sony Xperia Z3 Compact: лучший компактный телефон на базе Android получает новый облик
Хотя большинство производителей смартфонов сделали компактные версии своих флагманских телефонов, большинство из них были крайне ослаблены, и единственное сходство заключается в названии. Не так с Sony. это Xperia Z1 Compact упакован с тем же привлекательным дизайном, наддувом процессора и потрясающей камерой, что и его топовый брат, но в гораздо более карманном размере. Я был так впечатлен, что получил почти идеальный
Использование Divio с существующим образом Docker
Прежде чем продолжить, вам понадобится Счет Divio и иметь Инструменты разработчика Divio установлены. Этот урок предполагает практическое знание Git и знакомство со структурой проекта Django. Создать новый проект Первым шагом является создание нового проекта из панели управления Divio - я назвал мой «docker-tutorial». Выберите следующие параметры
Новый внутренний накопитель от MCE приносит Blu-ray для iMac & Mac mini
Хотя оригинальный член Ассоциация Blu-ray Disc Apple никогда не принимала формат, называя его « мешок с болью »И предпочитая направлять клиентов к собственному контенту« высокой четкости »через iTunes Store. Владельцы Mac
Понимание атаки DAO
Дэвид Сигел - стратег и спикер блокчейна, основатель Kryptodesign.com и куратор DecentralStation.com, места, где можно узнать о блокчейне. В этом выпуске Сигал пытается помочь журналистам понять, что произошло, когда DAO рухнул, и почему он считает, что для прессы важно правильно понять эту историю. Статья будет обновлена ​​на Средняя
Что такое дневная торговля?
... и вы узнаете: - Что такое дневная торговля? - Каковы его плюсы и минусы Дневная торговля - это тип торговли, который включает в себя открытие многих позиций в день и закрытие их в один и тот же день. В этом случае задачей трейдера является использование относительно небольших ценовых движений, которые происходят во время каждой сессии. Тем не менее, в отличие от скальпинга (тип торговли вы можете прочитать о
Лучшие брокеры форекс в Великобритании 2019: рейтинги и обзоры • Benzinga
Фондовый рынок большой, но валютный рынок намного больше. Фактически, с ежедневным объемом торгов более 5 триллионов долларов США, форекс является крупнейшим финансовым рынком в мире, и это может означать огромные возможности для трейдеров - будь вы в Лондоне, Бирмингеме или Манчестере. Многие из ведущих брокеров форекс в Великобритании базируются за рубежом. Это не плохо. Это означает, что в дополнение к регулированию Управление финансового поведения
Как получить Date из DateTime тип данных в SQL Server?
В SQL Server есть несколько способов вернуть дату из типа данных DateTime. Делая Разработка и программирование SQL , мы часто сталкиваемся с требованием извлечь столбцы формы, состоящие только из части даты, имеющие дату и время. Здесь я перечислил несколько наиболее распространенных и эффективных способов получить только часть даты из типов данных DateTime и DateTime2
Среди вкладов NN / g в мир UX, пожалуй, одним из наиболее упоминаемых является F-образный шаблон чтения для веб-ко...
Среди вкладов NN / g в мир UX, пожалуй, одним из наиболее упоминаемых является F-образный шаблон чтения для веб-контента, который мы определили в 2006 году. На протяжении многих лет многие ссылались на это исследование, иногда правильно, а во многих других случаях его неправильно истолковывали. В этой статье мы стремимся сообщить о недавних исследованиях, а также прояснить некоторые неправильные
Как настроить новый интерфейс Firefox Quantum
Firefox Quantum здесь, и это битком набитый улучшениями , включая новый пользовательский интерфейс Photon. Photon заменяет интерфейс «Australis», который используется с 2014 года, и содержит множество вариантов
AirNav: KSFB - Международный аэропорт Орландо Санфорд
... ия Идентификатор FAA: SFB Lat / Long: 28-46-37.1000N / 081-14-05.7000W 28-46.618333N / 081-14.095000W 28,7769722 / -81,2349167 (приблизительно) Высота: 54,9 фута / 16,7 м (при обследовании) Вариация: 05 Вт (2000 г.) От города: 16 миль к северо-востоку от Орландо, Флорида Часовой пояс: UTC-4 (UTC-5 в стандартное время) Почтовый индекс: 32773 Операции в аэропорту Использование в аэропорту: открыто для общественности Дата активации: 02/1943

Комментарии

9. Может ли новый соответствовать наследию?
9. Может ли новый соответствовать наследию? Также прочитайте: HTC One M9: матовый металлический динамитный стержень [FIRST LOOK]
Или вы ищете что-то альтернативное, что визуализирует ваши заметки более интересным и, к сожалению, достойным внимания способом?
Или вы ищете что-то альтернативное, что визуализирует ваши заметки более интересным и, к сожалению, достойным внимания способом? Мы отобрали лучшие альтернативы OneNote, которые помогут вам сделать заметку. Связанные : Evernote против OneNote - Что лучше для ваших заметок? 1. Zoho Notebook Мультиплатформенность и насыщенность функциями, Zoho

И вы узнаете: - Что такое дневная торговля?
9. Может ли новый соответствовать наследию?
9. Может ли новый соответствовать наследию?
Или вы ищете что-то альтернативное, что визуализирует ваши заметки более интересным и, к сожалению, достойным внимания способом?
Связанные : Evernote против OneNote - Что лучше для ваших заметок?