Вы не можете получить доступ к членам неизменяемой коллекции, созданной изнутри, для понимания.
Прежде всего, я собираюсь изменить ваш пример, чтобы он на самом деле создавал дубликаты:
for (i <- Range(1,3); j <- Range(1,3)) yield (i min j, i max j)
//scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,1), (1,2), (1,2), (2,2))
Для понимания просто синтаксический сахар, так что вот эквивалент с использованием map
и flatMap
, который дает точно такой же результат
Range(1,3).flatMap{i => Range(1,3).map{ j => (i min j, i max j)}}
Как видите, вы на самом деле не собираете одну коллекцию, а скорее коллекцию коллекций, а затем объединяете их вместе, как они созданы. Внутренний map
берет каждый j
в диапазоне и отображает его в пару, затем внешний flatMap
отображает каждый i
в последовательность пар и объединяет их вместе. Если я изменю flatMap
на map
, результат будет следующим:
Range(1,3).map{i => Range(1,3).map{ j => (i min j, i max j)}}
//Vector(Vector((1,1), (1,2)), Vector((1,2), (2,2)))
Таким образом, только после завершения всей операции вы можете получить доступ к результату как к одной коллекции. В результате получается Vector, который расширяет IndexedSeq[(Int, Int)]
, поэтому вы можете использовать любой из методов этой черты для результата, один из них - distinct
:
(for (i <- Range(1,3); j <- Range(1,3)) yield (i min j, i max j)).distinct
//Vector((1,1), (1,2), (2,2))