Язык 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 или меньше измерений.")
Один опрятный трюк - передать все аргументы и использовать allMatch
с предикатом, который вы хотите проверить:
if (IntStream.of(arg1, arg2m arg3).allMatch(x -> x > 0)) {
использовать переменную как значение сравнения, а затем вам не нужно менять ее несколько раз. Нет такого способа, как вы этого хотите.
Невозможно объединить оператор, чтобы проверить состояние, как вы хотите. Способ иметь только число once
может быть:
if(IntStream.of(arg1, arg2, arg3).allMatch(arg->arg>0)){
//..
}
Предполагая, что это переменные int
: вы можете использовать поток:
boolean gt3 = IntStream.of(arg1, arg2, arg3).allMatch(i -> i > 0);
То же самое относится к long
и double
, которые имеют специальные типы потоков.
Сначала вы можете использовать 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();
}
}
Если читаемость является вашей основной задачей, вы можете перенести тест на метод утилиты:
if ( allIntGreaterZero(arg1, arg2, arg3) ) {
...
}
public static boolean allIntGreaterZero(int... a) {
return Arrays.stream(a).allMatch(i -> i > 0);
}
Если это действительно то, что вы делаете в своем коде 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