如何创建 com.google.common.collect.Range 改变一个布德?

How to create com.google.common.collect.Range with one boud changed?

我需要创建新的 Range 对象,只更改一个(下限或上限)边界。其他绑定必须不变。

最方便的方法是什么?

我看到了方法 com.google.common.collect.Range#range(C lower, BoundType lowerType, C upper, BoundType upperType),但是当我需要更改较低值时,我必须从我的范围复制上限值 - 如果 upperBound 存在则要小心。

它看起来很丑(下面的示例)。我需要类似的代码来更改上限。有更简单的方法吗?

if (range.hasUpperBound()) {
    range = Range.range(value, BoundType.CLOSED, range.upperEndpoint(), timeSpend.upperBoundType());
} else {
    range = Range.upTo(value, BoundType.CLOSED);
}

Range 是不可变的,您只能根据另一个 Range 创建一个新的 Range。就像您在示例中给出的那样。

俗话说,你总是可以创建一个辅助方法。

我带来了以下通用辅助方法(它们创建了我需要的双闭范围)

 private static <T extends Comparable> Range<T> withLowerBound(Range<T> range, 
                                                              T lowerEndpoint) {
    if (range.hasLowerBound()) {
        return Range.closed(lowerEndpoint, range.upperEndpoint());
    } else {
        return Range.atLeast(lowerEndpoint);
    }
}

private static <T extends Comparable> Range<T> withUpperBound(Range<T> range,
                                                            T upperEndpoint) {
    if (range.hasLowerBound()) {
        return Range.closed(range.lowerEndpoint(), upperEndpoint);
    } else {
        return Range.atMost(upperEndpoint);
    }
}

因为 Range 是不可变的,所以必须按如下方式使用它们

myRange= setLowerBound(myRange, newLowerValue);
myRange= setUpperBound(myRange, newUpperValue);