多个if-else if带&&;JAVA8中的条件

多个if-else if带&&;JAVA8中的条件,java,java-8,Java,Java 8,我想在Java8最佳代码实践中转换以下代码 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; } 编辑:OP作为对问题的评论发布 if(counterFlag==

我想在Java8最佳代码实践中转换以下代码

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;
} 
编辑:OP作为对问题的评论发布

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; 
}
您可以像这样使用
Map

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

    map.put("00",()-> logic1());
    map.put("01",()-> 2);
    map.put("10",()-> 3);
    map.put("11",()-> 4);
并以这种方式使用:

map.get(String.valueOf(i)+String.valueOf(j)).get();

对于原始问题,我能想到的最好方法是:

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 ");     
    }
}
小心做一些棘手的事情,比如将数字组合成字符串并将其用作散列键。它价格昂贵,而且存在语义陷阱

对于更新后的问题,有一个简洁的解决方案:

if (i >= 0 && i <= 1 && j >= 0 && j <= 1) {
    return 1 + i + 2 * j;
}
如果(i>=0&&i=0&&j您也可以这样做

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

注意:在您的示例中,您默认返回3,因此如果
i=2
j=2
例如,您将返回
3
。这是预期行为吗?我将提供示例,其中假定
i
j
的值始终为
0
1

对于您的具体示例:

这似乎是一个很好的折衷方案,它简短易读:

if(counterFlag==0) {
    return priorityEnable == 0 ? 0 : 1;
}
return priorityEnable == 0 ? 2 : 3;
对于更复杂的情况(即3、4或更多变量): 我喜欢这样的东西:

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);
Map Map=newhashmap();
put(新的int[]{0,0},0);
put(新的int[]{0,1},1);
map.put(新的int[]{1,0},2);
map.put(新的int[]{1,1},3);
返回map.entrySet().stream()
.filter(e->e.getKey()[0]==counterFlag)
.filter(e->e.getKey()[1]==priorityEnable)
.map(map.Entry::getValue)
.findFirst()
.orelsetrow(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);
Map Map=newhashmap();
put(IntBuffer.wrap(newint[]{0,0}),0);
put(IntBuffer.wrap(newint[]{0,1}),1);
put(IntBuffer.wrap(newint[]{1,0}),2);
map.put(IntBuffer.wrap(newint[]{1,1}),3);
IntBuffer IntBuffer=IntBuffer.wrap(新的int[]{counterFlag,priorityEnable});
返回map.get(intBuffer);

我需要用return语句if(counterFlag==0&&priorityEnable==0){return 0;}else if(counterFlag==0&&priorityEnable==1){return 1;}else if(counterFlag==1&&priorityEnable==0){return 2;}else替换这个syso{return 3;}老实说,我看不到任何特定的java 8特性可以使这一点更好。我不确定这是不是一个示例。但仅对于该代码,您可以重构为
return I*2+j+1
@FedericoklezCulloca“最佳实践”是用“聪明的解决方案”替换该代码。另一种方法是将此过程应用于调用方,OP没有显示,因为这些返回值看起来很像会有另一个类似的测试代码或开关语句……对不起,我挑剔您的答案,但是当一个简单的
整数
会起作用时,为什么要使用
供应商
复杂的函数。为什么不停在这里呢?@VinceEmigh传递了一个供应商作为值,因为OP可以为每个条件声明一个方法。正如你所知,供应商是懒惰的,只有在你调用
get
方法时,他们才会调用。请看我更新的答案!使用
哈希映射
然后线性搜索它是一种浪费。使用as键,您可以通过
get
。@Holger以前从未访问过IntBuffers,我将使用编辑我的答案it@Holger我用你的建议编辑了我的答案,这就是你的想法吗?它有效,而且确实更有效。是的,就是这样。这将导致覆盖率问题为空永远不会到达
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);