Как собрать элементы коллекции на основе какого-либо метода? - PullRequest
2 голосов
/ 02 июня 2011

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

val order = Seq("a", "b", "c")
val map = Map("a" -> "aaa", "c" -> "ccc")

val elems = order.map(map.get(_)).filter(_.isDefined).map(_.get)

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

Ответы [ 4 ]

3 голосов
/ 02 июня 2011

Ну, стандартная карта Scala также является PartialFunction, поэтому вы можете использовать «collect».

val elems = order.collect(map)
2 голосов
/ 02 июня 2011

Если вы основываете его на возврате Option, то это работает:

order flatMap (map get)

Хотя, конечно, order collect map достаточно в этом конкретном примере.

1 голос
/ 02 июня 2011

В целом вы можете использовать представления;затем коллекция повторяется только один раз, и все три операции применяются по ходу:

order.view.map(map.get).filter(_.isDefined).map(_.get).force
1 голос
/ 02 июня 2011

Вы можете использовать flatMap для этого. Вот пример:

List(1,2,3,4,5).flatMap(x => if (x%2 == 1) Some(2*x) else None)

Это эквивалентно

List(1,2,3,4,5).filter(_%2==1).map(2*)
...