Проверьте, какие комбинации параметров являются нулевыми в Java - PullRequest
0 голосов
/ 23 ноября 2018

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

Предположим, что у меня есть 3 параметра (строки), переданных в функцию (может быть и Hashmap). Я хочу проверить, не является ли отдельная переменная или комбинация переменных Нулевым, и действовать соответственно.

Например, один из способов сделать это - использовать if-else следующим образом

if(a!=null && b == null && c == null) { 
      //doSomething   
}
 else if(a==null && b!= null && c == null ) { 
     //doSomething 
}
 else if(a==null && b0= null && c != null) { 
     //doSomething 
}
  ......
    //Similarly combination of two variables
 if(a!=null && b != null && c == null) {
     //doSomething 
}
 else if(a!=null && b== null && c != null) { 
    //doSomething
}
 else if(a==null && b!= null && c != null) { 
    //doSomething 
} 
  ......
    //and so on 
    //Similarly combination of three variables
 if(a!=null && b != null && c != null) {
    //doSomething 
}

   ....

Как добиться такой ситуации.Я нашел похожий вопрос , но не сделал код чистым.Любая помощь будет оценена

Ответы [ 5 ]

0 голосов
/ 23 ноября 2018

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

 public static void yourMethod(Object a,Object b,Object c)
  {
    int evaluation = howManyNotNull(a,b,c);

    if(evaluation == 0) // all are nulls
    {
      // your code
    }
    else if(evaluation == 1) // only one is not null
    {
      if(a!=null)
      {

      }
      else if(b!=null)
      {

      }
      else
      {
        // c not null
      }
    }
    else if(evaluation == 2) // two variables are not null but other one is null
    {
      if(a==null)
      {

      }
      else if(b == null)
      {

      }
      else
      {
        // c is null, a and b not null
      }
    }
    else 
    {
      // all abc not null
    }

  }

  private static int howManyNotNull(Object a, Object b, Object c)
  {
    return (a==null?0:1) + (b==null?0:1) + (c==null?0:1);
  }

Существует расширениеверсия этого, назначьте 3 простых значения для a, b, c (пример: a = 2, b = 3, c = 5), затем используйте поддерживающий метод, подобный этому

private static int convertAvailabilityToInt(Object a, Object b, Object c)
  {
    return (a==null?1:2) * (b==null?1:3) * (c==null?1:5);
  }

, если ответ1, тогда все не равны нулю.

0 голосов
/ 23 ноября 2018

Это моё решение.Обратите внимание, что у вас есть несколько if...else в одном методе.И тогда вы добавляете doSomething.Это будет ужасно, когда все будет готово, а потом и реализовано.

Что насчет перемещения одного отдельного условия в отдельный метод и присвоения ему относительного имени.Затем давайте инкапсулируем его в Consumer и все это в предопределенный список.Позже, если ваш doSomething будет огромным, вы можете перейти от одного метода к одному классу, не изменяя код клиента.

Это класс, чтобы собрать необходимую переменную для условий:

final class Data {

    private final String a;
    private final String b;
    private final String c;
}

Затем определите один Consumer для каждого оператора if:

Consumer<Data> wonderfulConsumer = data -> {
    if (a != null && b == null && c == null) {
        // do something for wonderful consumer
    }
};

Consumer<Data> badLuckConsumer = data -> {
    if (a == null && b != null && c == null) {
        // do something for bad luck consumer
    }
};

Обратите внимание, все эти потребители могут быть изменены по отдельности (даже в разных классах).

Затем в коде клиента определите список всех известных потребителей: List<Consumer<Data>> consumers = Arrays.asList(wonderfulConsumer, badLuckConsumer).

И, наконец, ваш метод будет таким, и вам не нужно его менять, когда вы решите изменить илидобавить потребителей.

Data data = new Data(a, b, c);
consumers.forEach(consumer -> consumer.accept(data));
0 голосов
/ 23 ноября 2018

Напишите эти вспомогательные функции, и вы можете легко сравнить n терминов.

public static boolean areAllNull(Object... objects) {
     return Stream.of(objects).allMatch(Objects::isNull);
}

public static boolean areAllNotNull(Object... objects) {
     return Stream.of(objects).allMatch(Objects::nonNull);
}

вы можете использовать эти функции для n сравнений.

if(areAllNotNull(a) && areAllNull(b,c)) { 
      //doSomething   
}
 else if(areAllNotNull(b) && areAllNull(a,c)) { 
     //doSomething 
}
 else if(areAllNotNull(c) && areAllNull(b,a)) { 
     //doSomething 
}
0 голосов
/ 23 ноября 2018

Вы все делаете правильно, но вы должны помнить, что примитивные типы данных не могут быть нулевыми.Например, строка не является нулевой, но пустая строка "", или int не может быть нулевой, по умолчанию она равна 0. В заключение Объекты типа Map, ArrayList или Integer .. вы можете проверить на нулевое значение, ноПримитивные типы данных не могут быть нулевыми, поэтому вы не можете проверить их на это.Для более глубокого понимания просто изучите примитивные и сложные типы данных.Надеюсь, я правильно понял вашу проблему:)

0 голосов
/ 23 ноября 2018

Вы можете использовать, например, трехзначную строку, имитирующую 3 флага.Сначала вы установите его на «000».Затем вы проверяете каждую переменную на null, если это не так, вы заменяете 0 на 1. Затем вы можете использовать переключатели для обработки каждого случая.

...