需求:
当我们想判断一个数字是否在某个范围的时候,往往是if -else
比如:
public static int getTemperatureLevel(double valuationScore) {
if (valuationScore >= 0 && valuationScore < 20) {
return 4; // 极低温
} else if (valuationScore >= 20 && valuationScore < 30) {
return 3; // 低温
} else if (valuationScore >= 30 && valuationScore < 70) {
return 2; // 常温
} else if (valuationScore >= 70 && valuationScore <= 100) {
return 1; // 高温
} else {
return 5; // 极高温
}
}
但是大量的if -else 显得不美观,而且不够优雅
在google的Guava里提供了RangeMap!
RangeMap简介
引入Guava依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
RangeMap 是一种集合类型(collection type),它将不相交、且不为空的 Range(key)映射给一个值(Value)。和 RangeSet不一样,RangeMap 不可以将相邻的区间合并,即使这个区间映射的值是一样的。
简单的讲就是可以把条件范围变成一个key,根据key获取value
写法就变成了:
// 定义表示温度范围的Map,极低温为1,低温为2,常温为3,高温为4,极高温为5
private static final RangeMap<Double, Integer> temperatureRangeMap = TreeRangeMap.create();
static {
temperatureRangeMap.put(Range.closedOpen(0.0,20.0), 1);
temperatureRangeMap.put(Range.closed(20.0, 30.0), 2);
temperatureRangeMap.put(Range.closed(30.0, 70.0), 3);
temperatureRangeMap.put(Range.closed(70.0, 80.0), 4);
temperatureRangeMap.put(Range.openClosed(80.0,100.0), 5);
}
Integer temp = temperatureRangeMap.get(15.0);
System.out.println("15.0这个温度的类型是"+temp);
大功告成!