Java: более короткий способ проверки нескольких аргументов на одно и то же значение в if-statement?

Язык Java не ограничивает количество измерений, но спецификация Java VM ограничивает количество измерений до 255.

Например , следующий код не скомпилируется:

class Main {
    public static void main(String[] args) {
        final int[][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][]
                 [][][][][][][][][][][][][][][][] x;
    }
}

с ошибкой:

1.java:18: error: array type has too many dimensions
                 [][][][][][][][][][][][][][][][] x;
                                                  ^
1 error

(Ссылка: https://docs.oracle.com/javase/ specs / jvms / se8 / html / jvms-4.html # jvms-4.4.1 "Дескриптор типа массива действителен только в том случае, если он представляет 255 или меньше измерений.")

3
задан Mureinik 13 July 2018 в 12:17
поделиться

7 ответов

Один опрятный трюк - передать все аргументы и использовать allMatch с предикатом, который вы хотите проверить:

if (IntStream.of(arg1, arg2m arg3).allMatch(x -> x > 0)) {
4
ответ дан Mureinik 17 August 2018 в 12:56
поделиться
  • 1
    Это именно то, что я искал, знал, что это должен быть способ сделать это. Благодаря :) – Arne O. Ose 13 July 2018 в 12:31

использовать переменную как значение сравнения, а затем вам не нужно менять ее несколько раз. Нет такого способа, как вы этого хотите.

-2
ответ дан Aponax 17 August 2018 в 12:56
поделиться

Невозможно объединить оператор, чтобы проверить состояние, как вы хотите. Способ иметь только число once может быть:

if(IntStream.of(arg1, arg2, arg3).allMatch(arg->arg>0)){
    //..
}
0
ответ дан azro 17 August 2018 в 12:56
поделиться

Предполагая, что это переменные int: вы можете использовать поток:

boolean gt3 = IntStream.of(arg1, arg2, arg3).allMatch(i -> i > 0);

То же самое относится к long и double, которые имеют специальные типы потоков.

2
ответ дан ernest_k 17 August 2018 в 12:56
поделиться

Сначала вы можете использовать Stream.of для этого:

if (Stream.of(arg1, arg2, arg3).allMatch(arg -> arg > 0))
{
    System.out.println("Passed (if)");
}
else
{
    System.out.println("Not passed (else)");
}

Но вы можете создать свою собственную «структуру» для использования следующим образом:

checkIf(arg -> arg > 0, 
        () -> System.out.println("Passed (if)"), 
        () -> System.out.println("Not passed (else)"), 
        arg1, arg2, arg3);

И здесь является реализация checkIf(), использованная выше:

public static <T> void checkIf(Predicate<T> predicate, Runnable actionIfTrue, Runnable actionIfFalse, T... values)
{
    if (Stream.of(values).allMatch(predicate))
    {
        actionIfTrue.run();
    }
    else
    {
        actionIfFalse.run();
    }
}
0
ответ дан fxrobin 17 August 2018 в 12:56
поделиться

Если читаемость является вашей основной задачей, вы можете перенести тест на метод утилиты:

if ( allIntGreaterZero(arg1, arg2, arg3) ) {
    ...
}

public static boolean allIntGreaterZero(int... a) {
    return Arrays.stream(a).allMatch(i -> i > 0);
}
0
ответ дан jpmath 17 August 2018 в 12:56
поделиться

Если это действительно то, что вы делаете в своем коде lot , то вы можете ввести расширение концепции signum с помощью enum.

/**
 * Extends the signum function to multiple arguments
 * <p>
 * If all signums are the same then that will be returned.
 * <p>
 * If any are different - return Mixed.
 */
enum Sign {
    Negative, Positive, Zero, Mixed;

    public static Sign get(int n) {
        return n < 0 ? Negative : n == 0 ? Zero : Positive;
    }

    public static Sign get(int... n) {
        Sign first = get(n[0]);
        for(int i = 1; i < n.length; i++) {
            if(get(n[i]) != first) {
                return Mixed;
            }
        }
        return first;
    }
}

Используйте его как:

Sign.get(arg1, arg2, arg3) == Sign.Positive
1
ответ дан OldCurmudgeon 17 August 2018 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: