【问题标题】:Make function generic for List<Boolean> and boolean[]使 List<Boolean> 和 boolean[] 的函数通用
【发布时间】:2017-02-10 02:38:23
【问题描述】:

我有两个函数可以检查数组或列表的所有元素是否都是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;
}

【问题讨论】:

  • 你在使用 Guava 吗?
  • @shmosel 没有番石榴
  • Java 8 怎么样?
  • 如果您将null 视为一个空数组,它应该返回true。

标签: java generics


【解决方案1】:

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

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

【讨论】:

  • 在幕后,这可能并不比我给出的答案更有效。
  • 我没有看到任何迹象表明 OP 担心效率。
  • 这两个答案的效率都低于问题中发布的代码。
  • @Winter 效率提升没有要求
  • @Winter 我很确定 OP 在技术意义上并不意味着通用。他只是想统一逻辑。
【解决方案2】:

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

你可以只接受一个对象

public static boolean allTrue(Object booleans) {

然后检查instanceof boolean[]或instanceof List&lt;Boolean&gt;,然后在方法中执行不同的代码。

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

【讨论】:

    【解决方案3】:

    我认为@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);
    }
    

    【讨论】:

    • 这不是改进吗? allTrue 的逻辑现在只需要在必要时在一个位置进行更改。
    【解决方案4】:

    List&lt;Boolean&gt; 和boolean[] 的共同祖先是Object,所以除非你对allTrue(Object booleans) 没问题,否则你不能只用一种方法。

    如果您将方法签名更改为allTrue(Iterable&lt;Boolean&gt; booleans),您所要做的就是创建一个特殊的Iterator&lt;Boolean&gt; 来遍历布尔数组。

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

    【讨论】:

    • List&lt;Boolean&gt; 和boolean[] 的共同祖先是Object。如果你计算接口,它们都实现了Serializable。这与您的观点无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2011-09-07
    • 1970-01-01
    • 2018-09-24
    • 2013-09-18
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多