是否有干净的语法来检查多个变量是否都具有相同的值?

我们有n个变量X = {x1,x2,...xn}它们不是任何结构。

例如在python中,我可以这样做: if (x1 == x2 == x3 == xn):

在java中,我必须这样做: if((x1 == x2) && (x2 == x3) && (x3 == xn)):

您是否知道改进此语法的简单方法? (想象一下很长的变量名称和很多)

谢谢。

如果你有很多这些变量,你是否考虑将它们放在一个集合中而不是将它们作为单独的变量? 那时有各种选择。

如果你发现自己做了很多,你可能想要编写辅助方法,可能使用varargs语法。 例如:

 public static boolean areAllEqual(int... values) { if (values.length == 0) { return true; // Alternative below } int checkValue = values[0]; for (int i = 1; i < values.length; i++) { if (values[i] != checkValue) { return false; } } return true; } 

由glowcoder提供的替代方案是强制存在至少一个值:

 public static boolean areAllEqual(int checkValue, int... otherValues) { for (int value : otherValues) { if (value != checkValue) { return false; } } return true; } 

在任何一种情况下,使用:

 if (HelperClass.areAllEqual(x1, x2, x3, x4, x5)) { ... } 

您可以创建一个这样的实用工具方法:

 public boolean allEqual(Object... objs) { if(objs.length < 2) return true; // 0 or 1 objects are all equal Object key = objs[0]; // pick one for(Object o : objs) if(!o.equals(key)) return false; return true; } 

另一种选择是

 public boolean allEqual(Object key, Object... objs) { for(Object o : objs) if(!o.equals(key)) return false; return true; } 

简化许多样板逻辑。 然后去吧

 if(allEqual(x,x1,x2,x3)) 

显然这两者是相互排斥的(它们具有特征性的暧昧)但你可以拥有allEqualallEqualWithKey

与@ Jon的解决方案类似,但更短。

 public static boolean areAllTheSame(int value, int... values) { for (int i: values) if(value != i) return false; return true; } 

你可以写一个方法,使这看起来不那么麻烦:

 boolean areAllEqual(Object... values) { if (values.length < 2) { return true; } for (int i = 1; i < values.length; i++) { if (!values[i].equals(values[0])) { return false; } } return true; } 

像这样用它:

 if (areAllEqual(x1, x2, x3, x4, x5)) { // do something } 

编辑太慢......! 🙁

不幸的是,不,没有可用的语法糖。 这是关于Java的常见抱怨。

如果你不喜欢打字,你可能会失去嵌套的paretheses:

 if(x1 == x2 && x2 == x3 && x3 == xn); 

实现此目的的另一种快速方法是通过array – > List – > HashSet转换路由,如:

标准Java:

 if(new HashSet(Arrays.asList(x1, x2, x3, x4, x5)).size() == 1) { } 

谷歌番石榴:

 if(Sets.newHashSet(Ints.asList(x1, x2, x3, x4, x5)).size() == 1) { } 

不过,前面提到的解决方案看起来并不太干净,所以它绝对应该被分离成一个具有合理名称的独立实用方法(在这种情况下,你可能会更好地使用Peter Lawrey或Jon Skeet的解决方案)第一名)。

我还希望这种方法与至少一个微小的性能损失相关联,因为很明显,必须实例化和填充多个Collection

所以重申一下 – 如果你一心想要打一个单线,只能使用这个解决方案。

 /* * reference - basic String to compare against * entries - all other objects for comparison */ public static boolean allEqual(String reference, String... entries) { return Arrays.stream(entries) .allMatch(entry -> Objects.equals(reference, entry)); } /* * Method can be generalized to use  instead of String */ public static boolean allEqual(T reference, T... entries) { return Arrays.stream(entries) .allMatch(entry -> Objects.equals(reference, entry)); } public static void main(String[] args) { System.out.println(allEqual("X", "X", "X", "X")); // true System.out.println(allEqual("X", "X", "Y")); // false System.out.println(allEqual("X")); // true System.out.println(allEqual(10, 10, 9)); // false System.out.println(allEqual(10, 10)); // true System.out.println(allEqual(10, new Integer[] {10, 10, 10})); // true } 

我喜欢已经建议的样板逻辑,但通常列表中的任何参数都可以为null ,这可能导致抛出NullPointerException 。 因此,我们应首先测试null并使用==在适当的地方比较对象引用:

 public static boolean allEqual(Object key, Object... objs) { for(Object o : objs) if((key != null && !key.equals(o)) || key != o) return false; return true; } 

org.apache.commons.lang3.BooleanUtils public static boolean and(final boolean … array)

使用Java 8,我喜欢使用java.util.stream.Stream来执行此操作:

 boolean b = Stream.of(obj1, obj2, obj3).anyMatch(it -> it == null) 

为了找出任何给定对象obj1obj2obj3是否为空。

在Java 8中,这可以使用Stream作为单行完成:

 boolean allEqual = Stream.of(x1, x2, x3, x4).distinct().count() == 1; 

基本上distinct过滤流,因此只保留唯一的元素。 如果该流中只剩下一个元素,则表示所有原始元素都相等。