我有以下if else块。
<div id="app-container">
<iframe width="500" height="500" src="https://beta.app.com"></iframe>
</div>
代码看起来很笨拙。有什么办法可以优化它。
答案 0 :(得分:3)
一种奇特的方法是使用三元运算符。但这与使用if级联没有什么不同,但是是单个分配(如果output
是final
,则很方便,尽管即使在这种情况下也并非绝对必要)。
output =
result.first
? (result.last ? "both present" : "first present")
: (result.last ? "last present" : "none present");
由于有4种可能的结果,因此无法将其降低到log_2(4) == 2
个嵌套条件以下。
您还可以使用预定义的查找映射。
答案 1 :(得分:1)
if (result.first && result.last){
output= "both present"
} else if (result.last) {
output= "last present"
} else if (result.first) {
output= "first present"
} else {
output = "none present"
}
此外,如果可以的话,可以将逻辑放入“结果”中,那么您就不必“获取”属于结果的东西。如果您将逻辑推得足够远,甚至可以用多态替换if / else。
答案 2 :(得分:1)
使用嵌套的if
语句,而不是同时检查两个条件:
if (result.first) {
if (result.last) {
output = "both present";
} else {
output = "first present";
}
} else {
if (result.last) {
output = "last present";
} else {
output = "none present";
}
}
这很容易导致使用三元条件运算符:
if (result.first) {
output = (result.last ? "both present" : "first present");
} else {
output = (result.last ? "last present" : "none present");
}
也可以嵌套:
output = (result.first ? (result.last ? "both present" : "first present")
: (result.last ? "last present" : "none present"));
如果要检查的布尔值很多,则深层嵌套会变得很麻烦,因此您可以选择使用位掩码:
private static final String[] OUTPUTS = { "none present", "first present",
"last present", "both present" };
output = OUTPUTS[(result.first ? 1 : 0) + (result.last ? 2 : 0)];
答案 3 :(得分:0)
let myDict = ["key1" : 200.0, "key2" : 180.0]
let randomKey = myDict.keys.randomElement()!
let randomValue = myDict[randomKey]!
答案 4 :(得分:0)
这是我处理类似语句的方法,假设result
是一个对象,并且具有两个原始布尔成员(请记住,在“ big”布尔中可能为null){{1 }}和first
(使用getter方法)
last
让我们在public class Result {
private boolean first;
private boolean last;
//getters, constructor etc
}
中包装条件,并将其放入map中,其中key为谓词,value为期望值:
Predicate
然后您可以通过以下方式使用它:
private final static Predicate<Result> = RESULT_1-> result.getFirst() && result.getLast();
private final static Predicate<Result> = RESULT_2 -> !result.getFirst() && result.getLast();
private final static Predicate<Result> = RESULT_3 -> result.getFirst() && !result.getLast();
private final static DEFAULT_VALUE = "none present";
private final static Map<Predicate<Result>, String> RESULT_MAP = Map.of(
RESULT_1, "both present",
RESULT_2, "last present",
RESULT_3, "first presnt");
当然要给这些变量指名,进行一些提取等操作。在这种方法中,当您必须向代码中添加新条件时,只需向映射中添加新谓词即可。如果您的体积很小,则不必像我展示的那样编写灵活的代码,但是在更复杂的问题中,此方法很适用。