使List <boolean>和boolean []的函数通用

时间:2017-02-10 02:38:24

标签: java generics

我有两个函数可以检查数组或列表的所有元素是否为true。我把两者结合起来遇到了麻烦。如何将函数化为一个通用的Java函数。

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;
}

4 个答案:

答案 0 :(得分:4)

如果您正在使用Guava,可以将布尔数组包装在Booleans.asList()中并将其作为列表传递:

.box-body { 
  min-height: 0;  /* new */
}

.content-body {
  min-height: 0;  /* new */
}

答案 1 :(得分:2)

根据https://stackoverflow.com/a/5606435/2310289

你可以接受一个对象

public static boolean allTrue(Object booleans) {

然后检查instanceof boolean[]instanceof List<Boolean>,然后在方法中执行不同的代码。

同样,不是真正的改进,而是更接近代码统一

答案 2 :(得分: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);
}

答案 3 :(得分: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));
}