кратно, если еще, если с условием && в JAVA8 - PullRequest
3 голосов
/ 16 января 2020

Я хочу преобразовать приведенный ниже код в java 8 лучших кодов практики

if(i==0 && j==0) {
    return 1;    
} else if (i==0 && j==1) {
    return 2;
} else if (i==1 && j==0) {
    return 3;
} else if (i==1 && j==1) {
    return 4;
} 

РЕДАКТИРОВАТЬ: ОП опубликовано в качестве комментария к вопросу

if(counterFlag==0 && priorityEnable==0) { 
    return 0; 
} else if (counterFlag==0 && priorityEnable==1) { 
    return 1; 
} else if (counterFlag==1 && priorityEnable==0) { 
    return 2; 
} else { 
    return 3; 
}

Ответы [ 4 ]

4 голосов
/ 16 января 2020

Лучшее, что я могу придумать для ОРИГИНАЛЬНОЙ проблемы, не будучи неясным / нечитаемым, это:

if (i == 0) {
    if (j == 0) {
        System.out.println("print something ");     
    } else if (j == 1) {
         System.out.println("print something ");     
    }
} else if (i == 1) {
    if ( j== 0) {
        System.out.println("print something ");     
    } else if (j == 1) {
         System.out.println("print something ");     
    }
}

Остерегайтесь таких хитрых вещей, как объединение чисел в строки и использование их в качестве ключей ha sh , Это дорого, и есть semanti c ловушек.

Для ОБНОВЛЕННОЙ проблемы есть изящное решение:

if (i >= 0 && i <= 1 && j >= 0 && j <= 1) {
    return 1 + i + 2 * j;
}
2 голосов
/ 16 января 2020

Вы можете использовать Map<String,Supplier<Integer>>, как это.

Map<String, Supplier<Integer>> map = new HashMap<>();

    map.put("00",()-> logic1());
    map.put("01",()-> 2);
    map.put("10",()-> 3);
    map.put("11",()-> 4);

вы можете передать каждый метод, который он возвращает Integer в результате.

private int logic1(){
  //your logic... 
  return 1;
}

и используйте таким образом:

map.get(String.valueOf(i)+String.valueOf(j)).get();
1 голос
/ 16 января 2020

Примечание: в вашем примере вы возвращаете 3 по умолчанию, поэтому если, например, i=2 или j=2, вы вернете 3. Это ожидаемое поведение? Я приведу примеры, где предполагается, что значения i и j всегда будут 0 или 1

. Для вашего конкретного примера c:

Кажется, это хороший компромисс, он короче и достаточно прост для чтения:

if(counterFlag==0) {
    return priorityEnable == 0 ? 0 : 1;
}
return priorityEnable == 0 ? 2 : 3;

Для более сложных случаев (например, 3, 4 или более переменных): Я бы go за что-то вроде этого:

Map<int[], Integer> map = new HashMap<>();
map.put(new int[] {0, 0}, 0);
map.put(new int[] {0, 1}, 1);
map.put(new int[] {1, 0}, 2);
map.put(new int[] {1, 1}, 3);

return map.entrySet().stream()
        .filter(e -> e.getKey()[0] == counterFlag)
        .filter(e -> e.getKey()[1] == priorityEnable)
        .map(Map.Entry::getValue)
        .findFirst()
        .orElseThrow(IllegalArgumentException::new);

РЕДАКТИРОВАТЬ: @Holger указал, что "Это пустая трата использовать HashMap и затем искать его линейно. Используйте IntBuffer в качестве ключа, и вы можете выполнить прямой поиск с помощью get "

. Это хороший момент, я попробовал его, и я думаю, что он имел в виду:

Map<IntBuffer, Integer> map = new HashMap<>();
map.put(IntBuffer.wrap(new int[] {0, 0}), 0);
map.put(IntBuffer.wrap(new int[] {0, 1}), 1);
map.put(IntBuffer.wrap(new int[] {1, 0}), 2);
map.put(IntBuffer.wrap(new int[] {1, 1}), 3);

IntBuffer intBuffer = IntBuffer.wrap(new int[] {counterFlag, priorityEnable});
return map.get(intBuffer);
1 голос
/ 16 января 2020

вы тоже можете это сделать ...

int value = (i==0 && j==0)?1:(i==0 && j==1)?2:(i==1 && j==0)?3:(i==1 && j==1)?4:null;
...