Bootstrap

如何使用Map来取代if else的范围判断

需求:

当我们想判断一个数字是否在某个范围的时候,往往是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);

大功告成!

;