说我有许多原始变量的列表:
["sTest_Val_1 ", "<", " 50"]
确保它们都具有相同价值的惯用方法是什么?显而易见的方法就是
final int a = 3;
final int b = 4;
final int c = 4;
final int d = 4;
final int e = 4;
但我认为这很容易出错并且难以阅读,特别是当变量具有正确的名称时,与我的示例不同。
if (a == b && a == c && a == d && a == e) // ...
如果我们能像这样进行比较会很好:
if ( numCategories == numTypes && numCategories == numColours
&& numCategories == numStyles && numCategories == numPrices) // ...
但显然if (a == b == c == d == e)
解析为布尔值,因此我们无法将其与a == b
进行比较。
JDK或其他实用程序库中是否有库函数,可能有这样的签名?
c
然后我们可以这样使用它:
static boolean areEqual(int... numbers)
我自己可以很容易地编写这样的函数,但是如果你不需要重新发明轮子呢?
也许还有另一种惯用的方式来实现这一点,我很想念。
答案 0 :(得分:3)
使用Stream
,您可以利用一些方便的方法来实现目标。
您可以使用Stream
或IntStream
的{{1}}与distinct()
相结合来查找唯一元素的数量:
对于count()
变量:
int
对于参考类型变量:
if (IntStream.of(a,b,c,d,e).distinct().count() == 1) {
}
另一种方式,可能效率较低(但我会保留它,因为这是我想到的第一件事)是创建一个if (Stream.of(a,b,c,d,e).distinct().count() == 1) {
}
所有要比较的元素,然后将它们收集到一个Stream
并检查Set
的大小为1(因为Set
不允许重复):
Set
或
if (IntStream.of(a,b,c,d,e).boxed().collect(Collectors.toSet()).size() == 1) {
}
对于一般if (Stream.of(a,b,c,d,e).collect(Collectors.toSet()).size() == 1) {
}
s。
答案 1 :(得分:3)
一个天真的选择是构建接收所有变量作为varargs的方法,并一个接一个地比较它们。如果其中一个不同,您将获得false
public static boolean areEqual(int...nums)
{
for (int i = 0 ; i < nums.length - 1 ; ++i) {
if (nums[i] != nums[i + 1]) {
return false;
}
}
return true;
}
用途
if (areEqual(a, b, c, d, e))
答案 2 :(得分:0)
我喜欢这种方法。没有自动装箱,也没有神奇的数字。
As per the documentation,它也会短路,因此可能比其他方法更有效。更重要的是,它很容易阅读。
IntStream.of(a, b, c, d).allMatch(x -> x == e);
归功于saka1029。