Или как избежать случайного удаления дубликатов при отображении Set
?
Это ошибка, которую я делаю очень часто. Посмотрите на следующий код:
def countSubelements[A](sl: Set[List[A]]): Int = sl.map(_.size).sum
Функция должна считать накопленный размер всех содержащихся списков. Проблема заключается в том, что после сопоставления списков с их длинами результат все еще равен Set
, а все списки размера 1 уменьшены до одного представителя.
Это только у меня такая проблема? Что я могу сделать, чтобы предотвратить это? Я думаю, что я хотел бы иметь два метода mapToSet
и mapToSeq
для Set
. Но нет никакого способа обеспечить это, и иногда вы не замечаете локально, что работаете с Set
.
Может быть, даже возможно, что вы пишете код для Seq
, и что-то меняется в другом классе, и базовый объект становится Set
?
Может быть, что-то вроде лучшей практики, чтобы вообще не допустить возникновения этой ситуации?
Удаленное редактирование нарушает мой код
Представьте себе следующую ситуацию:
val totalEdges = graph.nodes.map(_.getEdges).map(_.size).sum / 2
Вы извлекаете коллекцию Node
объектов из графа, используете их, чтобы получить смежные ребра и суммировать их. Это работает, если graph.nodes
возвращает Seq
.
И он ломается, если кто-то решит заставить Graph
вернуть его узлы как Set
; без этого кода, который выглядит подозрительно (по крайней мере, не для меня, вы ожидаете, что каждая коллекция может в конечном итоге быть Set
?) и не касаясь его.