Если вы ищете краткость, возможно, это решение подойдет (за счет эффективности - подробнее об этом позже):
import scala.util.Try
def parseLongForm(rgb: String): Try[(Int, Int, Int)] =
Try {
rgb.replace("#", "").
grouped(2).toStream.filter(_.length == 2).
map(Integer.parseInt(_, 16)) match { case Stream(r, g, b) => (r, g, b) }
}
def parseShortForm(rgb: String): Try[(Int, Int, Int)] =
parseLongForm(rgb.flatMap(List.fill(2)(_)))
def parse(rgb: String): Option[(Int, Int, Int)] =
parseLongForm(rgb).orElse(parseShortForm(rgb)).toOption
С точки зрения краткости, каждая функция, по сути, является однострочной (если это то, что вы ищете прямо сейчас).
Ядром является функция parseLongForm
, которая пытается проанализировать длинную 6-символьную длинную форму с помощью:
- удаление символа
#
- группировка символов в пары
- фильтрация одиночных предметов (если у нас нечетное количество символов)
- парсинг каждой пары
- совпадение с ожидаемым результатом для извлечения отдельных предметов
parseLongForm
представляет возможность сбоя с Try
, что позволяет изящно проваливаться при parseInt
или при сбое сопоставления с образцом.
parse
вызывает parseLongForm
и, если результатом является сбой (orElse
), вызывает parseShortForm
, который просто пытается использовать тот же подход после удвоения каждого символа.
Он успешно проходит предоставленные вами тесты (спасибо, что облегчает решение вопроса намного ).
Основная проблема этого подхода заключается в том, что вы все равно пытаетесь разобрать длинную форму, даже если с самого начала будет ясно, что она не будет работать. Таким образом, это не рекомендуемый код, если это может быть узким местом производительности для вашего варианта использования. Другая проблема заключается в том, что, хотя это более или менее скрыто, мы используем исключения для управления потоком данных (что также снижает производительность).
Хорошие вещи - это краткость и, я бы сказал, удобочитаемость (как я бы сказал, код довольно просто отображает проблему), но читаемость, конечно, по определению в глазах смотрящего. ).
Вы можете найти это решение на Scastie .