摆脱 IF 语句是一件有趣的事情。使用 Map 是其中一种方法。由于调用了 isMatch 方法,它并不完全适用于这种情况,但我提供它作为一个替代方案,可以将 similarityCount 方法体缩减为一行代码和一个 IF。
以下代码有两个 IF。如果 GetOrDefault 没有评估第二个参数,它可以被缩减为一个 IF。不幸的是,它确实这样做了,因此 isMatch 内部的空值检查是必要的。
如果您愿意,您可以进一步简化这个过程。例如,isMatch 可以返回 4 或 5 而不是布尔值,这将帮助您进一步简化。
import com.google.common.collect.ImmutableMap;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import java.util.Map;
public class SimilarityCount {
private Map<SimilarityCountKey, Integer> rtn = ImmutableMap.of(new SimilarityCountKey(null, null), 1, new SimilarityCountKey(null, ""), 2, new SimilarityCountKey("", null), 3);
public int similarityCount(String one, String two) {
return rtn.getOrDefault(new SimilarityCountKey(one, two), isMatch(one, two) ? 4 : 5);
}
private boolean isMatch(String one, String two) {
if (one == null || two == null) {
return false;
}
return one.equals(two);
}
private class SimilarityCountKey {
private final boolean one;
private final boolean two;
public SimilarityCountKey(String one, String two) {
this.one = one == null;
this.two = two == null;
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
}
如果有其他人想尝试另一种解决方案,这里有一些测试可以帮助你入手
import org.junit.Assert;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
public class SimilarityCountTest {
@Test
public void one(){
Assert.assertThat(new SimilarityCount().similarityCount(null,null), is(1));
}
@Test
public void two(){
Assert.assertThat(new SimilarityCount().similarityCount(null,""), is(2));
}
@Test
public void three(){
Assert.assertThat(new SimilarityCount().similarityCount("",null), is(3));
}
@Test
public void four(){
Assert.assertThat(new SimilarityCount().similarityCount("",""), is(4));
}
@Test
public void five(){
Assert.assertThat(new SimilarityCount().similarityCount("a","b"), is(5));
}
}
if
块内有return
值,那么你不需要使用else
。 - Manh Leswitch
...另外,如果您的代码仍然需要显式的空值检查,那么类型系统的意义是什么? - Jared Smith