仅在某些条件匹配时如何更新列表

时间:2018-12-05 16:56:56

标签: scala

我正在执行以下操作以映射和更新列表:

if (colors.map(_.id).contains(updated.id)) {
  val newColorList = updated :: colors.filterNot(s => s.id == updated.id)
  SomeMethod(newColorList)
}
else {
  this
}

以上方法正常,但是,我想添加一个条件,例如:If, and only if, the updated quantity is 0 then also update the enddate to todays date

我已经完成了以下

if (color.map(_.id).contains(updated.id) && updated.quantity == 0) {
 val newColorList = updated.copy(enddate = Instant.now().toEpochMilli) :: colors.filterNot(s => s.id == updated.id)
}
else if (color.map(_.id).contains(updated.id)) {
 val newColorList = updated :: colors.filterNot(s => s.id == updated.id)
 SomeMethod(newColorList)
}
else {
  this
}

与多个if / else语句相比,有没有更好的方法

2 个答案:

答案 0 :(得分:0)

类似

Optional<String>

答案 1 :(得分:0)

您可以在collect集合上使用colors

我假设有一个简单的案例类Color

case class Color(id:String, quantity: Int, endDate : LocalDate)

updated的类型也为Color

import java.time.LocalDate

case class Color(id:String, quantity: Int, endDate : LocalDate)

val updated = Color("one", 0, LocalDate.now)

val colors = List(
             Color("one", 1, LocalDate.now().minusMonths(2)), 
             Color("two", 2, LocalDate.now.minusMonths(4)),
             Color("three", 3, LocalDate.now.minusMonths(6))
            )

  colors.collect{
  case e if e.id == updated.id && updated.quantity == 0 => 
      updated.copy(endDate =  LocalDate.now) //add element to new list, call method
  case e if e.id == updated.id => updated
  case e =>  e
}
//List(Color(one,0,2018-12-06), Color(two,2,2018-08-06), Color(two,2,2018-06-06))

希望这对您有所帮助。