Как минимизировать утверждение If else ниже?или я должен использовать карту или переключатель? - PullRequest
0 голосов
/ 26 ноября 2018
public String identifyCellular(Long phone1, Long phone2, Long phone3) {

    String cellular = null;
    if (String.valueOf(phone2).trim().replaceAll("\\D", " ").equals("(07'\\d'{8})|(467'\\d'{8})")) {
        cellular = String.valueOf(phone2).trim().replaceAll("\\D", " ");
    } else if (String.valueOf(phone1).trim().replaceAll("\\D", " ").equals("(07'\\d'{8})|(467'\\d'{8})")) {
        cellular = String.valueOf(phone1).trim().replaceAll("\\D", " ");
    } else {
        cellular = String.valueOf(phone3).trim().replaceAll("\\D", " ");
    }
    return cellular;
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

При чтении вашего кода я не уверен, является ли приведенный выше алгоритм искусством для искусства или реальной необходимостью решить проблему.Следуя вашему курсу, я предлагаю избавиться от высказываний

public String identifyCellular(Long... phones) {
    String matchedRegex = "(07'\\d'{8})|(467'\\d'{8})";
    Pattern pattern = Pattern.compile(matchedRegex);
    Optional<Long> first = Arrays.stream(phones)
        .filter(filterMatchingNumber(pattern))
        .findFirst();
    return String.valueOf(first.orElse(giveLastPhone(phones)));    
  }

  private Long giveLastPhone(Long[] phones) {
    return phones[phones.length - 1];
  }

  private Predicate<Long> filterMatchingNumber(Pattern r) {
    return phone -> r.matcher(getPhone1Trimmed(phone)).find();
  }

  private String getPhone1Trimmed(Long phone1) {
    return String.valueOf(phone1).trim().replaceAll("\\D", " ");
  }

Похоже, что в этом случае не требуется обрезка и замена нецифрового (\ D) пробела.Я рекомендую рассмотреть возможность пропустить это

  final String matchedRegex = "(07'\\d'{8})|(467'\\d'{8})";
  final Pattern pattern = Pattern.compile(matchedRegex);

  public String identifyCellular(Long... phones) {
    Optional<Long> first = Arrays.stream(phones)
        .filter(filterMatchingNumber(pattern))
        .findFirst();
    return String.valueOf(first.orElse(giveLastPhone(phones)));
  }

  private Long giveLastPhone(Long[] phones) {
    return phones[phones.length - 1];
  }

  private Predicate<Long> filterMatchingNumber(Pattern pattern) {
    return phone -> pattern.matcher(phone.toString()).find();
}
0 голосов
/ 26 ноября 2018

Кажется, хорошо, особенно если вы используете только оператор 1 else-if, а каждая if оценка состояния отличается от переменной.Тем не менее, вы могли бы сделать его чище, обрезав все 3 переменные перед блоком if, реорганизовав регулярное выражение и сразу же вернувшись в оператор if.

Также, чтобы сопоставить с регулярным выражением, используйте Pattern.compile()и Pattern.matcher(), чтобы получить соответствующую группу.Затем используйте find(), чтобы проверить, есть ли совпадение.

public String identifyCellular(Long phone1, Long phone2, Long phone3) {

    String matchedRegex = "(07'\\d'{8})|(467'\\d'{8})";
    Pattern r = Pattern.compile(matchedRegex);

    String phone1Trimmed = String.valueOf(phone1).trim().replaceAll("\\D", " ");
    String phone2Trimmed = String.valueOf(phone2).trim().replaceAll("\\D", " ");
    String phone3Trimmed = String.valueOf(phone3).trim().replaceAll("\\D", " ");

    if (r.matcher(phone2Trimmed).find()) {
        return phone2Trimmed;
    } else if (r.matcher(phone1Trimmed).find()) {
        return phone1Trimmed;
    } else {
        return phone3Trimmed;
    }
}
...