【问题标题】:Scala: return element using if inside map functionScala:在map函数中使用if返回元素
【发布时间】:2017-05-27 15:48:31
【问题描述】:

我在 scala 中有一个 Person 类型的列表,如下所示:

Person("P1", "Person 1", List(WorkStation 1, WorkStation 2))
Person("P2", "Person 2", List(WorkStation 1, WorkStation 3, WorkStation 4, WorkStation 5))
Person("P3", "Person 3", List(WorkStation 3, WorkStation 5))
Person("P4", "Person 4", List(WorkStation 2, WorkStation 4))

我想编写一个函数来接收这个列表和一个参数ws: WorkStation.WorkStation(它是一个案例对象),然后我希望该函数返回第一个元素Person,它的列表中有ws

例如,如果wsWorkstation 3,我想返回带有Person 2 的列表条目。

我想过做这样的事情:

def setPerson(ws: WorkStation.WorkStation, totalPersons: List[Person]): Person = {
    totalPersons.map { p => if (p.workstations.contains(ws)) return p }
}

但是,这不会编译,因为它给了我一个错误,而且它肯定不是最实用的方法。

谁能帮帮我?

【问题讨论】:

    标签: scala list functional-programming


    【解决方案1】:

    你可以使用collectFirst:

    totalPersons.collectFirst{ case p if p.workstations.contains(ws) => p }
    

    find:

    totalPersons.find(_.workstations.contains(ws))
    

    更多信息请参见here

    【讨论】:

    • 这对我帮助很大,但是,尝试使用您的Find 解决方案时,该函数返回Some(Person(...)) 而不是Person(...)。我应该做哪些调整来完成我想要的?
    • 它返回的是一个选项,如果你确定你总能从列表中找到一个满足你的谓词的元素,那么你可以使用get方法来获取Person就像@987654331 @,如果不确定,如果找不到元素,使用getOrElse(...)返回默认值。
    • 完美。谢谢。
    【解决方案2】:
    totalPersons.find(elem => elem.workstations.contains(ws))
    

    totalPersons.find(_.workstations.contains(ws))
    

    第一个更具可读性(特别是对于 scala 菜鸟),但第二个是常用的语法糖

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2017-11-23
      • 2013-10-21
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2011-07-27
      • 2019-03-11
      相关资源
      最近更新 更多