Java-可以替代Google Guava Ranges吗?

时间:2018-11-26 11:02:35

标签: java collections guava

我有一个Map,其中存储了指标名称和Ranges,它们代表每个指标的有效期。这样存储起来非常方便:

private Map<String, Range<Long>> metricRanges = new HashMap<>();

当我需要检查给定的时间戳是否在范围内时,我只是检索了键的范围,然后检查了范围是否包含时间戳。

Range<Long> rangeOfDates = metricRanges.get(key);
if (rangeOfDates != null && rangeOfDates.contains(timestamp)) {
    return true;
}

但是,我遇到了必须使用不提供Range功能的Google Guava 14.0之前的库的情况。可以用Ranges适当替代数据结构,以检查给定值是否在Range中?

当前,我正在考虑创建一个List<Long> ranges,其中包含两个表示上限和下限的值。这样,我就可以检查时间戳是否在“范围”内,例如:

private Map<String, List<Long>> metricRanges = new HashMap<>();
List<Long> rangeOfDates = metricRanges.get(key);
if (timestamp >= rangeOfDates.get(0) && timestamp <= rangeOfDates.get(1)) {
    return true;
}

我是否错过了可以实现的其他可选解决方案,例如Guava 14.0之前的版本?

UPD :刚刚找到了一些与我正在寻找的东西接近的东西-来自Apache commons-lang的Range类。具体是LongRange实现。

2 个答案:

答案 0 :(得分:2)

我将从以下内容开始:

class Range<T extends Number> {
    private final T start;
    private final T end;

    Range(T start, T end) {
        this.start = start;
        this.end = end;
    }

    public boolean contains(Number n) {
        return start.longValue() <= n.longValue() && n.longValue() <= end.longValue();
    }
} 

答案 1 :(得分:0)

如果您要处理时间范围,则可以从IntervalThreeTen-Extra中受益,其描述为:

  

两个时刻之间不可改变的时间间隔。

     

一个时间间隔表示两个瞬时之间的时间线上的时间。该类存储开始时刻和结束时刻,包括开始时刻和结束时刻。结束时刻始终大于或等于开始时刻。

由于Interval是在Instant上运行,而不是长期运行,因此您必须确定在这种情况下是否值得使用它。