Как создать 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
, Как то, что вы дали в своем примере.
С этим высказыванием вы всегда можете создать вспомогательный метод.