Я думаю, что код довольно хорош, на самом деле. Я бы сделал это:
def attributeValue(attrs: (String, String)*)(n: Node) =
attrs forall {
case (key, value) => n attribute key exists (_ == value)
}
С другой стороны,
def attributeValue(attrs: (String, String)*)(n: Node) =
attrs forall {
case (key, value) => n \ ("@"+key) exists (_ == value)
}
Основным преимуществом forall
над reduceLeft
является то, что первый остановится на первом ложном результате, а второй будет повторяться по каждой паре ключ / значение, даже если ложное совпадение гарантировано.