Override values for overlapping objects between two scala lists
No need to run find twice, just run it once and store the result in a value of type Option[MyWidget].

You can then use Option#fold and pass in two functions: one to run when the option contains a matching widget, and another when no match was found.

def setOverrideValues(inv : List[MyWidget], cat: List[MyWidget]) : List[MyWidget] = {
  inv.map (k =&gt; {
    val wOpt = cat.find(_.sku == k.sku)

    wOpt.fold(ifEmpty = k.copy(name = "No Catalog Label")) {
      w =&gt; k.copy(name = w.name, label = w.label)
    }
  })
}


You could also use pattern matching

def setOverrideValues(inv : List[MyWidget], cat: List[MyWidget]) : List[MyWidget] = {
  for (k &lt;- inv)
    yield cat.find(_.sku == k.sku) match {
      case Some(w) =&gt; k.copy(name = w.name, label = w.label)
      case _ =&gt; k.copy(name = "No Catalog Label")
    }
}


Both options would save you from repeated calls to find or getOrElse