Проверьте, содержит ли строка несколько значений в Java без использования операторов ИЛИ?

#java #refactoring #operators #contains

Вопрос:

У меня здесь есть код, который проверяет, содержит ли заголовок записи одно из четырех значений, которые мы хотим игнорировать. Если заголовок содержит 4 строки, мы хотели бы поместить его в базу данных и установить значение state IGNORE . Если это не так, мы все равно хотим поместить его в базу данных и установить значение state NEW для последующей обработки.

Код работает, однако, это немного раздражает глаза. Как я мог бы написать это более чистым, эффективным и простым для чтения способом?

 if (  record.getTitle().contains("word") ||  record.getTitle().contains("different word") ||  record.getTitle().contains("phrase") ||  record.getTitle().contains("different phrase")  ) {  int id = dao.insert(nv);  nvRecord =  NV  .builder()  .from(nv)  .setId(id)  .setState(state.IGNORE)  .build();  } else {  int id = dao.insert(nv);  nvRecord =  NV  .builder()  .from(nv)  .setId(id)  .setState(state.NEW)  .build();  }  

Ответ №1:

Вы можете использовать регулярное выражение для «Названия», за которым следует один, два, три или четыре. Нравится,

 if (record.getTitle().matches("Title [1234]")) {  

Или скомпилируйте Pattern и используйте Matcher подобное

 Pattern p = Pattern.compile("Title [1234]"); Matcher m = p.matcher(title); if (m.matches()) {  

Основываясь на ваших обновленных требованиях, передайте в потоковом List режиме ваши специальные заголовки и проверьте, содержит ли их название записи. Нравится,

 if (List.of("Titanic", "The Great Gatsby", "Catch Me If You Can", "Inception")  .stream().anyMatch(record.getTitle()::contains))  

Комментарии:

1. Вам не нужно | находиться внутри класса персонажей. Должно быть [1234] или [1-4] .

2. @хелвуд Хорошая мысль. Я не думал об этой части (ясно).

3. Спасибо вам за ваш ответ! Я забыл указать, что названия сильно отличаются друг от друга и не следуют шаблону. Например: «Титаник», «Великий Гэтсби», «Поймай Меня, Если Сможешь», «Начало»

4. if (List.of("Titanic", "The Great Gatsby", "Catch Me If You Can", "Inception").stream().anyMatch(record.getTitle()::contains))

5. Большое вам спасибо! Это намного чище!