У меня есть список типа Person в Scala, как это:

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 (это объект case), а затем я хочу, чтобы эта функция возвращала первый элемент Person, в котором ws список.

Например, если ws был Workstation 3, я хотел бы вернуть запись в списке с помощью Person 2.

Я думал о том, чтобы сделать что-то вроде этого:

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

Тем не менее, это не компилируется, потому что это дает мне ошибку, и это не самый функциональный подход наверняка.

Кто-нибудь может мне помочь?

1
undisp 27 Май 2017 в 18:48

2 ответа

Лучший ответ

Вы можете использовать collectFirst:

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

Или find:

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

См. здесь для получения дополнительной информации.

2
Psidom 27 Май 2017 в 16:02
totalPersons.find(elem => elem.workstations.contains(ws))

Или

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

1-й является более читабельным (особенно для новичков в Scala), но 2-й - это обычный синтаксический сахар

0
pedrorijo91 27 Май 2017 в 19:56