У меня есть PartialFunction[String,String]
и Map[String,String]
. Я хочу применить частичные функции к значениям карты и собрать записи, для которых она была применена. т.е. Дано:Применение частичной функции на поле кортежа, сохранение структуры кортежа
val m = Map("a"->"1", "b"->"2")
val pf : PartialFunction[String,String] = {
case "1" => "11"
}
Я хотел бы, чтобы каким-то образом объединить _._2
с pf
и быть в состоянии сделать это:
val composedPf : PartialFunction[(String,String),(String,String)] = /*someMagicalOperator(_._2,pf)*/
val collected : Map[String,String] = m.collect(composedPf)
// collected should be Map("a"->"11")
до сих пор лучшее, что я получил это:
val composedPf = new PartialFunction[(String,String),(String,String)]{
override def isDefinedAt(x: (String, String)): Boolean = pf.isDefinedAt(x._2)
override def apply(v1: (String, String)): (String,String) = v1._1 -> pf(v1._2)
}
есть лучший способ?
Это выглядит как лучший способ сделать то, что я сделал, я искал что-то более общее, возможно, даже ootb в стандартной библиотеке. Думая об этом, линзы могут сделать трюк. –
Я понимаю, я тоже пытался найти что-то ootb без успеха. Я сомневаюсь, что есть что-то, потому что вам нужно будет либо написать функции совершенно разных типов: '(String, String) => (String, String)' и 'String => String', или как-то вроде« гнезда »в другой - это то, что делает мой пример. В любом случае, я не могу даже подпись такой функции комбинирования быть отвратительной. – Mifeet
принял ответ. Я обновлю здесь, если найду аккуратный способ добиться этого с помощью линз. –