RomanToArabicConverter.java

package diffblue.roman;

import java.util.Map;
import java.util.function.ToIntFunction;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;


public final class RomanToArabicConverter implements ToIntFunction<String> {
    private static final Map<String, Integer> ROMAN_TO_ARABIC = Map.ofEntries(
            Map.entry("CM", 900),
            Map.entry("M", 1000),
            Map.entry("CD", 400),
            Map.entry("D", 500),
            Map.entry("XC", 90),
            Map.entry("C", 100),
            Map.entry("XL", 40),
            Map.entry("L", 50),
            Map.entry("IX", 9),
            Map.entry("X", 10),
            Map.entry("IV", 4),
            Map.entry("V", 5),
            Map.entry("I", 1)
    );
    private static final Pattern TOKEN_PATTERN = Pattern.compile("C?M|C?D|X?C|X?L|I?X|I?V|I");

    @Override
    public int applyAsInt(String value) {
        return TOKEN_PATTERN.matcher(value).results()
                .map(MatchResult::group)
                .mapToInt(ROMAN_TO_ARABIC::get)
                .sum();
    }
}