EDIT
Хорошо, @dhg обнаружил, что требуется синтаксис точечного метода, если блок кода для fold() не привязан к val (почему с reduce() в том же блоке кода можно использовать синтаксис метода пробела, я не знаю). Во всяком случае, конечный результат довольно лаконичен:
result.map { row =>
addLink( row.href, row.label )
}.fold(NodeSeq.Empty)(_++_)
Что в некоторой степени отрицает первоначальный вопрос; т. е. во многих случаях можно упорядочить сценарии «или/или» в более высоком порядке и избежать «жирных», повторяющихся операторов if/else.
ORIGINAL
Попытка уменьшить обработку if/else при работе с потенциально пустыми коллекциями, такими как List[T]
Например, предположим, что мне нужно получить последние новостные статьи, чтобы создать NodeSeq из html-новостей <li><a>links</a></li>
:
val result = dao.getHeadlines // List[of model objects]
if(result.isEmpty) NodeSeq.Empty
else
result map { row =>
addLink( row.href, row.label ) // NodeSeq
} reduce(_ ++ _)
Это нормально, довольно лаконично, но я обнаружил, что хочу использовать троичный стиль, чтобы обратиться к этим единственным случаям:
result.isEmpty ? NodeSeq.Empty :
result map { row =>
addLink( row.href, row.label )
} reduce(_ ++ _)
Я видел несколько старых сообщений о сутенерстве троичного в логическое, но любопытно узнать, какие есть альтернативы, если таковые имеются, для оптимизации if/else?
match {...}
, IMO, немного раздут для этого сценария, и for {...} yield
, похоже, тоже мало помогает.