Как создать com.google.common.collect.Range с одним измененным бодом?

Мне нужно создать новый Range объект, изменяющий только одну (нижнюю или верхнюю) границу. Другая граница должна быть неизменной.

Какой самый удобный способ сделать это?

Я вижу метод com.google.common.collect.Range#range(C lower, BoundType lowerType, C upper, BoundType upperType), но когда мне нужно сменить нижнее, я должен скопировать верхнее значение из моего диапазона - и быть осторожным, если верхняя граница вообще существует.

Это выглядит довольно некрасиво (пример ниже). И мне нужен подобный код для изменения верхней границы. Есть ли более простой способ сделать это?

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

2 ответа

Решение

Я пришел со следующими, универсальными вспомогательными методами (они создают двойной закрытый диапазон, который мне нужен)

 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);

Range является неизменным, вы можете только создать новый Range основанный на другом Range, Как то, что вы дали в своем примере.

С этим высказыванием вы всегда можете создать вспомогательный метод.

Другие вопросы по тегам