2017-02-10 5 views
5

У меня есть две функции, которые проверяют, являются ли все элементы массива или списка true. У меня проблемы с этим. Как я могу превратить функции в одну общую функцию Java.Сделать функцию общей для списка <Boolean> и boolean []

public static boolean allTrue(boolean[] booleans) { 
    if (booleans == null) { 
     return false; 
    } 

    for (boolean bool : booleans) { 
     if (!bool) { 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean allTrue(List<Boolean> booleans) { 
    if (booleans == null) { 
     return false; 
    } 

    for (boolean bool : booleans) { 
     if (!bool) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

Вы используете Guava случайно? – shmosel

+0

см. Http://stackoverflow.com/a/5606435/2310289 –

+0

@shmosel No Guava – Kwoppy

ответ

4

Если вы используете Guava, вы можете обернуть булево массив в Booleans.asList() и передать его в виде списка:

public static boolean allTrue(boolean[] booleans) { 
    return booleans != null && allTrue(Booleans.asList(booleans)); 
} 
+0

Под капотом это, вероятно, не более эффективно, чем ответ, который я дал. –

+0

Я не вижу никаких указаний, что ОП был обеспокоен эффективностью. – shmosel

+0

Оба ответа менее эффективны, чем код, размещенный в вопросе. – Winter

1

Я думаю, что ответ дается @Joel был хорошим, за исключением для вопроса, указанного в комментарии. Если мы просто конвертировать boolean[] в Boolean[], можно попробовать следующее:

public static boolean allTrue(List<Boolean> booleans) { 
    if (booleans == null) { 
     return false; 
    } 

    for (boolean bool : booleans) { 
     if (!bool) { 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean allTrue(boolean[] booleans) { 
    Boolean[] newArray = new Boolean[booleans.length]; 
    int i = 0; 
    for (boolean value : booleans) { 
     newArray[i++] = Boolean.valueOf(value); 
    } 

    return Arrays.asList(newArray); 
} 
+1

Как это не улучшение? Логика «allTrue» теперь должна быть изменена только в одном месте, если это необходимо. –

2

По https://stackoverflow.com/a/5606435/2310289

Вы можете просто принять объект

public static boolean allTrue(Object booleans) { 

, а затем проверить instanceof boolean[] или instanceof List<Boolean>, а затем выполнить другой код внутри метода.

Опять же, на самом деле не улучшение, но немного ближе к закодировать объединительный

1

общего предка List<Boolean> и boolean[] является Object, так что если вы не в порядке с allTrue(Object booleans), вы не можете сделать это с одним методом.

Если вы меняете свою подпись метода на allTrue(Iterable<Boolean> booleans), вам нужно создать специальный Iterator<Boolean>, чтобы пересечь булевский массив.

import java.util.Iterator; 
import java.util.NoSuchElementException; 

public class BooleanAllTrue { 
    public static boolean allTrue(Iterable<Boolean> booleans) { 
     if (booleans == null) return false; 

     for (Boolean bool : booleans) { 
      if (!bool) return false; 
     } 

     return true; 
    } 

    public static Iterable<Boolean> asIterable(final boolean[] booleens) { 
     return new Iterable<Boolean>() { 
      public Iterator<Boolean> iterator() { 
       final boolean[] booleans = booleens; 
       return new Iterator<Boolean>() { 
        private int i = 0; 

        public boolean hasNext() { 
         return i < booleans.length; 
        } 

        public Boolean next() { 
         if (!hasNext()) throw new NoSuchElementException(); 
         return booleans[i++]; 
        } 

        public void remove() {throw new UnsupportedOperationException("remove");} 
       }; 
      } 
     }; 
    } 

    public static void main(String [] args) { 
     System.out.println(allTrue(asIterable(new boolean[]{true, true}))); 
     System.out.println(allTrue(asIterable(new boolean[]{true, false}))); 
     try { 
      asIterable(new boolean[0]).iterator().next(); 
     } catch (NoSuchElementException e) { 
      // expected 
     } 
    } 
} 

И, наконец, метод allTrue(boolean[] booleans).

public static boolean allTrue(boolean[] booleans) { 
    return allTrue(asIterable(booleans)); 
} 
+1

* Общий предок для 'List ' и 'boolean []' is 'Object' *. Если вы считаете интерфейсы, они оба реализуют 'Serializable'. Не то, что имеет отношение к вашей точке. – shmosel