“按位或” 运算的巧妙运用
今天在学习Collections的源码时,看到下面的代码,联系之前自己写的程序,感受到下面这段代码确实巧妙:
1 public static <T> boolean addAll(Collection<? super T> c, T... elements) { 2 boolean result = false; 3 for (T element : elements) 4 result |= c.add(element); 5 return result; 6 }
下面简单介绍:
“T... elements” :可变参数列表,元素为泛型T或T的子类。
“|=”:这是类似于“+=”这样的运算式,是A = A + B这种形式的简写A+=B;它们是等价的。或“|”运算,二进制运算是同“0”为“0”,否则为“1”。逻辑或“|”,同假为假否则为真。
1 false |= false => 结果为false; 2 true |= false => 结果为true; 3 false |= true => 结果为true; 4 true |= true => 结果为true;
在第一段代码中,2号 boolean result = false; 通过后面的运算,只要有一次c.add(element)的运算其中一次返回true,则整个方法的返回值就是true.——个人感觉精妙之处在于此(略显少见多怪)
延伸
逻辑与“&&” 运算
若我们的需求为:只要有一次失败,整体返回失败。只要有一次为假,则都为假。
1 public class Test { 2 3 public static boolean change(boolean... params){ 4 boolean result = true; 5 for (boolean temp : params) { 6 result = result && temp; 7 } 8 return result; 9 } 10 11 public static void main(String[] args) { 12 System.out.println(Test.change(true, false)); // false 13 System.out.println(Test.change(false, false)); // false 14 System.out.println(Test.change(true, true)); // true 15 } 16 }