эффективный способ сравнить несколько значений int до 0 - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь сравнить три длины с 0, и мне было интересно, есть ли более эффективный / более чистый способ, чем повторение "! = 0".

public static boolean isTriangle(int lengthA, int lengthB, int lengthC) {
    if (lengthA != 0 && lengthB != 0 && lengthC != 0) { //is there a shorter/cleaner way to write this?
        //do a thing
    }
    return false;
}

Ответы [ 4 ]

2 голосов
/ 03 октября 2019

Вы можете использовать IntStream и allMatch

if(IntStream.of(lengthA,lengthB,lengthC).allMatch(i->i!=0)) {
     // do a thing
  }

или также noneMatch

IntStream.of(lengthA,lengthB,lengthC).noneMatch(i->i==0)

Другой способ сделать это - иметьМетод util

public static boolean isNotZero(int val) {
       return val!=0;
     }

Теперь упростим условие if

if (isNotZero(lengthA) && isNotZero(lengthB) && isNotZero(lengthC)) { 
1 голос
/ 03 октября 2019

Вы спрашиваете три вещи;вы запрашиваете код, который

  1. короче
  2. более эффективен
  3. очиститель

У меня есть альтернатива для вас:

if ((lengthA & lengthB & lengthC) != 0)

Это правильно - он делает то же самое, что и ваш старый код (он использует поразрядно-и)

  1. это короче .
  2. потенциально более эффективно , но может подтвердить только хороший микробенчмарк. Даже если это так, это не должно вас направлять. В связи с пунктом 3 его следует учитывать только в том случае, если он обнаруживается как узкое место в вашем приложении с использованием инструмента анализа производительности, что весьма и весьма маловероятно.
  3. однако это не очиститель . И под этим я подразумеваю, что это сделает ваш код труднее для чтения и понимания, и любому, кто поддерживает ваш код, теперь придется задуматься о битовых манипуляциях.

Скорее всего, то же самое пойдет для любой предложенной альтернативы. .

То, что вы делали в исходном коде, достаточно хорошо;это то, что люди понимают, и, скорее всего, это самый чистый код, который вы можете написать для этой цели.

1 голос
/ 03 октября 2019

Лучший ответ (ИМХО): "Даже не пытайтесь угадать оптимизирующий компилятор." Просто укажите исходный код так, как он наиболее точно указывает (для ваших собратьев, больше ничего ...) что вы хотите, чтобы компьютер делал. Не предполагайте, что фактическая последовательность машинных инструкций, которая фактически дана аппаратному обеспечению, фактически соответствует этому. "Это волшебство. Действительно."

0 голосов
/ 03 октября 2019

Для языка Java ваш код хорош. Нет лучшего способа сделать это в Java.

...