Как улучшить условную логику с помощью Java 8 - PullRequest
0 голосов
/ 02 апреля 2019

Я нахожусь в процессе изучения Java 8, и я хотел знать, есть ли чистый способ переписать приведенный ниже код более эффективно в Java 8:

public static Map<String, Character> parseOrg(String org) {
    Map<String, Character> map = new HashMap<String, Character>();
    if (org != null && !org.isEmpty()) {
        String modifiedString = trimOrg(org); //private method to substring
        if (modifiedString.length() == 4) {
            populateMap(modifiedString.charAt(modifiedString.length()-1), modifiedString.charAt(modifiedString.length()-2), modifiedString.charAt(modifiedString.length()-3), modifiedString.charAt(modifiedString.length()-4));
        } else if (modifiedString.length == 3) {
            populateMap(modifiedString.charAt(modifiedString.length()-1), modifiedString.charAt(modifiedString.length()-2), modifiedString.charAt(modifiedString.length()-3), null);
        } else if (modifiedString.length == 2) {
            populateMap(modifiedString.charAt(modifiedString.length()-1), modifiedString.charAt(modifiedString.length()-2), null, null);
        } else if (modifiedString.length == 1) {
            populateMap(modifiedString.charAt(modifiedString.length()-1), null, null, null);
        }
    } else {
        LOG.error("Null org provided");
    }
    return map;
}

private static void populateMap(Map<String, Character> map, Character pos0, Character pos1, Character pos2, Character pos3) {
    map.put("Position 3", pos3);
    map.put("Position 2", pos2);
    map.put("Position 1", pos1);
    map.put("Position 0", pos0);
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Вы могли бы сделать что-то вроде этого:

Runnable r = Arrays.asList(() -> {}, YourClass::doD, YourClass::doC, YourClass::doB, YourClass::doA, () -> {})
    .get(Math.min(Math.max(0, org.length()), 4));
r.run();

Но, честно говоря, оно того не стоит.Просто используйте переключатель.

1 голос
/ 03 апреля 2019

Ваш вопрос странный, поскольку кажется, что он каждый раз вызывает один и тот же метод doX().Если это действительно то, что вам нужно, вы можете создать простое выражение if и указать диапазон:

if(modifiedString.length() >= 1 && modifiedString.length() <= 4) {
    doX();
}

Если вы действительно имели в виду, что это разные методы и они выполняют разные функции в зависимости от modifiedString.lengthзначение, вы можете использовать оператор switch, как это предлагают другие:

switch (modifiedString.length()) {
    case 1:
        doA();
        break;
    case 2:
        doB();
        break;
    case 3:
        doC();
        break;
    case 4:
        doD();
        break;
    default:
        //if no case match
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...