简体   繁体   中英

Scala list foreach, update list while in foreach loop

I just started working with scala and am trying to get used to the language. I was wondering if the following is possible:

I have a list of Instruction objects that I am looping over with the foreach method. Am I able to add elements to my Instruction list while I am looping over it? Here is a code example to explain what I want:

    instructions.zipWithIndex.foreach { case (value, index) =>
      value match {
        case WhileStmt() => {
            ---> Here I want to add elements to the instructions list.

        }
        case IfStmt() => {
                ...
        }
        _ => {
                ...
        }

Idiomatic way would be something like this for rather complex iteration and replacement logic:

@tailrec
def idiomaticWay(list: List[Instruction],
                 acc: List[Instruction] = List.empty): List[Instruction] =
  list match {
    case WhileStmt() :: tail =>
      // add element to head of acc
      idiomaticWay(tail, CherryOnTop :: acc)
    case IfStmt() :: tail =>
      // add nothing here
      idiomaticWay(tail, list.head :: acc)
    case Nil => acc
  }

val updatedList = idiomaticWay(List(WhileStmt(), IfStmt()))
println(updatedList) // List(IfStmt(), CherryOnTop)

This solution works with immutable list , returns immutable list which has different values in it according to your logic.

If you want to ultimately hack around ( add , remove , etc) you could use Java ListIterator class that would allow you to do all operations mentioned above:

def hackWay(list: util.List[Instruction]): Unit = {

  val iterator = list.listIterator()
  while(iterator.hasNext) {
    iterator.next() match {
      case WhileStmt() => 
        iterator.set(CherryOnTop)
      case IfStmt() => // do nothing here
    }
  }
}

import collection.JavaConverters._

val instructions = new util.ArrayList[Instruction](List(WhileStmt(), IfStmt()).asJava)

hackWay(instructions)

println(instructions.asScala) // Buffer(CherryOnTop, IfStmt())

However in the second case you do not need scala :( So my advise would be to stick to immutable data structures in scala .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM