Возвращаемое значение, если не ноль - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь написать как можно меньше строк. Что было бы лучшим способом переписать это в Java? (скажем, у нас есть «publi c enum A»)

Я хочу иметь способ написать «если что-то не равно null, верните его, в противном случае продолжайте». Я посмотрел в Optional, но Optional.of (...). IfPresent (v -> return v;) не работает, хотя я это сделал sh.

Кроме того, если вы спрашиваете, почему Я изменяю массив внутри for-l oop, вы можете считать, что существует несколько начальных массивов, и мне нужно проверить каждый из них.

public A getAValue() {
   int[] arr = new int[7];
   A returnValue = null;

   for (int i=0; i<10; i++) {

      //change arr
      returnValue = checkSomeCondition(arr);
      if (returnValue != null) {
         return returnValue;
      }

      //change arr again
      returnValue = checkSomeCondition(arr);
      if (returnValue != null) {
         return returnValue;
      }

      //change arr yet again
      returnValue = checkSomeCondition(arr);
      if (returnValue != null) {
         return returnValue;
      }
   }


   return A.UNKNOWN;
}

public A checkSomeCondition(int[] arr) {
   if (arr[0]==arr[1]) {
      return arr[0]==2 ? A.VALUE_1 : A.VALUE_2;
   }

   return null;
}

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Не ясно, какой тип проверки вы делаете или как вы изменяете
ваши массивы, но это может быть возможно:

Это должно игнорировать все возвращаемые значения null и возвращать только
first successful результат теста.

Если безуспешно, необходимо предоставить возвращаемый объект default.

enum A {
    A_VALUE_1, A_VALUE_2, A_UNKNOWN
};

List<Object[]> testArrays = new ArrayList<>();
testArrays.add(new int[] { 1, 2, 3 });
testArrays.add(new int[] { 3, 4, 5 });
testArrays.add(new int[] { 2, 2, 6 });

A res =
        // stream the set of arrays   
        testArrays.stream()

        // apply each set in order to the method
        // replacing the array under test with the
        // method result
        .map(arr->checkSomeCondition(arr))

         // filter out any null results
         .filter(result->result!=null)

         // get the first non-null result
         .findFirst()

         // return the result or some default answer if all
         // results were null.
         .orElseGet(()->A.A_UNKNOWN);

System.out.println(res);

С предоставленными данными печатается

A_VALUE_1

Ваш метод теста


public A checkSomeCondition(int[] arr) {
    if (arr[0] == arr[1]) {
        return arr[0] == 2 ? A.A_VALUE_1 : A.A_VALUE_2;
    }

    return null;
}

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

1 голос
/ 25 апреля 2020

Q: Я посмотрел в Optional, но Optional.of (...). IfPresent (v -> return v;) не работает, хотя я w sh сделал

Optional::ifPresent работает, но отличается от запланированного. return находится внутри реализации метода Consumer. Более того, Consumer ничего не возвращает, тип возвращаемого метода - void .

Q: Я пытаюсь написать как можно меньше строк насколько это возможно.

Вы достигаете того, что хотите, с помощью предварительно определенного набора поставщиков Supplier<int[]> и другого for-l oop внутри уже существующего с несколькими итерациями так же, как ряд условий.

List<Supplier<int[]>> arrays = new ArrayList<>();
arrays.add(() -> firstArraySource());
arrays.add(() -> secondArraySource());
...

for (...) {                                         // your initial loop
    for (Supplier<int[]> arraySupplier: arrays) {   // iterate through Suppliers
        arr = arraySupplier.get();                  // get an array (here is the evaluation)
        returnValue = checkSomeCondition(arr);      // getting the 'A' value
        if (returnValue != null) {                  // returnin if not null
            return returnValue;
        }
    }
}

Преимущество этого подхода состоит в том, что если источники массивов ex. из базы данных они не будут называться до тех пор, пока они на самом деле не нужны, поскольку они заключены в поставщиках. Расчет происходит при вызове Supplier::get.

0 голосов
/ 25 апреля 2020

Используйте Optional.ofNullable вместо Optional.of, поскольку последнее не может использоваться для возможных нулевых значений. Это будет работать, а также делегировать эту задачу функции checkSomeCondition:

public Optional<A> checkSomeCondition(int[] arr) {
    if (arr[0] == arr[1]) {
        return Optional.<A>of(arr[0]==2 ? A.VALUE_1 : A.VALUE_2);
    }
    return Optional.<A>empty();
}

... и затем проверить наличие значения в getAValue.

быть проверено в al oop, то есть

public A getAValue() {
    int[] arr = new int[7];
    final int maxChecks = 10;
    Optional<A> returnValue = Optional.<A>empty();

    for (int i = 0; i < 10; i++) {
        int j = 0;
        while (!returnValue.isPresent() && j < maxChecks) {
             returnValue = checkSomeCondition(arr);
             j++;
        }
        return returnValue.get();
    }
    return A.UNKNOWN;
}
...