确保许多价值观平等的惯用方法

时间:2017-06-20 10:37:02

标签: java

说我有许多原始变量的列表:

["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)

我自己可以很容易地编写这样的函数,但是如果你不需要重新发明轮子呢?

也许还有另一种惯用的方式来实现这一点,我很想念。

3 个答案:

答案 0 :(得分:3)

使用Stream,您可以利用一些方便的方法来实现目标。

您可以使用StreamIntStream的{​​{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