Как я могу изменить свои для l oop полных операторов if на более элегантный / эффективный код? - PullRequest
4 голосов
/ 06 марта 2020

Это моя строка:

String field = "first=true, second=true"

Мой метод работает с этой строкой и распознает, содержит ли она подстроки first= и second=, и если да - на основе значений true / false, следующих за ней вызывает другие методы. Первая и вторая подстроки могут быть необязательными, хотя. Это то, что у меня есть до сих пор:

void method(String field) {

      String[] splittedField = field.split(", ");
      for (String substring : splittedField) {
          if (substring.contains("first") {
              if (substring.contains("true") {
                  otherMethod("first", "true");
              } else if (substring.contains("false") {
                  otherMethod("first", "false");
              }
          } else if (substring.contains("second") {
              if (substring.contains("true") {
                  otherMethod("second", "true");
              } else if (substring.contains("false") {
                  otherMethod("second", "false");
              }
          }
      }

}

Но, возможно, есть лучший / более эффективный (и элегантный?) Способ решения этого случая?

Ответы [ 7 ]

3 голосов
/ 06 марта 2020

Вы можете сделать это просто следующим образом:

String[] splittedField = field.split(", ");
for (String substring : splittedField) {
    String[] parts = substring.split("=");
    otherMethod(parts[0], parts[1]);
}
3 голосов
/ 06 марта 2020

Рассмотрим:

if (substring.contains("first") {
    if (substring.contains("true") {
        otherMethod("first", "true");
    } else if (substring.contains("false") {
        otherMethod("first", "false");
    }
 } 

Выше if можно кодировать как:

if (substring.contains("first") {
    String[] valueString = substring.split("=");            
    otherMethod("first", valueString[1]);
 }
2 голосов
/ 06 марта 2020

Вам не нужны все операторы if.

Для проверок вы можете создать пару наборов, а для вызова метода вы можете снова разделить каждую подстроку, = :

void method(String field) {

    Set<String> firstSecond = Set.of("first", "second");
    Set<String> trueFalse = Set.of("true", "false");

    String[] splittedField = field.split(", ");
    for (String substring : splittedField) {
        String[] args = substring.split("=");
        if (firstSecond.contains(args[0]) && trueFalse.contains(args[1])) {
            otherMethod(args[0], args[1]);
        }
    }
}

Примечание: если вы еще не используете Java9 +, вы можете переписать Set.of следующим образом:

Set<String> firstSecond = new HashSet<>(Arrays.asList("first", "second"));
1 голос
/ 06 марта 2020

Вот улучшенная версия для вашего кода. Некоторые моменты, которые вы должны иметь в виду. 1. Вы можете напрямую вызвать метод contains в otherMethod, так как он также ожидает логического значения.

void method(String field) {
  String[] splittedField = field.split(", ");
  for (String substring : splittedField) {
    if (substring.contains("first") {
        otherMethod("first", substring.contains("true"));
    } else if (substring.contains("second") {
        otherMethod("second", substring.contains("true"));
    }
  }
}
1 голос
/ 06 марта 2020

На основании вопроса ОП и его комментария этого достаточно, я думаю?:

void method(String field) {

      Arrays.stream(field.split(", "))
            .forEach(v -> {
                 String[] args = v.split("=");
                 otherMethod(args[0], args[1]);
            })
}
1 голос
/ 06 марта 2020

В решении, которое использует Stream s, вы можете выполнить что-то вроде:

void invokeOtherMethod(String field) {
    Map<String, Boolean> mapFromString = Arrays.stream(field.split(","))
            .map(s -> s.trim().split("="))
            .collect(Collectors.toMap(a -> a[0], a -> Boolean.valueOf(a[1])));
    for (Map.Entry<String, Boolean> entry : mapFromString.entrySet()) {
        otherMethod(entry.getKey(), entry.getValue());
    }
}

Примечание : изменение подписи otherMethod с целью использования:

void otherMethod(String key, boolean value)
1 голос
/ 06 марта 2020

Я думаю, что-то подобное устранит сложную if структуру.

public class Main {
    public static void method(String field) {
        int i = 0;
        // Make the flags false by default, 
        // in case you don't supply either or both of them in field.
        String[] flags = {"false", "false"};
        String[] splittedField = field.split(", ");
        for (String substring : splittedField) {
            String[] args = substring.split("=");
            flags[i] = args[1];
            ++i;
        }
        othermethod(flags[0], flags[1]);
    }

    public static void main(String[] args) {
            String field = "first=true, second=false";
            method(field);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...