10

Let's say I have a list:

val list = List(1, 2, 3, 4, 5)

I want to replace all/first items that satisfy a predicate, I know the following way to do it: (e.g. replace any number that is even with -1)

val filteredList = list.zipWithIndex.filter(_._2 % 2 == 0)

val onlyFirst = list.updated(filteredList.head._2, -1)

val all = for (i <- list) yield if (i % 2 == 0) -1 else i

Is there any collection function or nice Scala way that helps in this situation and has a good performance?

I also want to keep the order, so I don't want to use filterNot and add other items to the list like: (it's also not efficient)

val onlyFirst = list.filterNot(_ % 2 != 0) ::: list.filter(_ % 2 == 0).map(x => -1)
Andrii Abramov
  • 10,019
  • 9
  • 74
  • 96
Omid
  • 1,959
  • 25
  • 42

1 Answers1

20

Simple & efficient: Replace all items

list.map( x => if (x % 2 == 0) -1 else x )

Replace one item

val index = list.indexWhere( _ % 2 == 0 )
list.updated(index, -1)
jazmit
  • 5,170
  • 1
  • 29
  • 36
  • 2
    What language is this? :) You should also remove `then`. But it's great, simple and effecient – Archeg Nov 18 '15 at 20:11