У java есть функция зажима?
Предположим, что у меня есть value
, я обычно делаю это, чтобы "закрепить" его в диапазоне, здесь диапазон [0..1]
. То есть, если он находится ниже начала диапазона, увеличьте его до начала диапазона, он превысит конец диапазона, уменьшите его до конца диапазона.
clampedValue = Math.max(0, Math.min(1, value));
Есть ли встроенная функция для зажима в диапазоне?
Ответы
Ответ 1
Посмотрев на общий метод зажима, предложенный в другом ответе, стоит отметить, что у него бокс/распаковка для примитивных типов.
public static <T extends Comparable<T>> T clamp(T val, T min, T max) {...}
float clampedValue = clamp(value, 0f, 1f);
Это будет использовать класс оболочки Float
, в результате чего будут выполняться 3 полевые операции, по одному для каждого параметра и 1 операция unbox для возвращаемого типа.
Чтобы этого избежать, я просто буду писать длинную руку или использовать не-общую функцию для типа, который вы хотите:
public static float clamp(float val, float min, float max) {
return Math.max(min, Math.min(max, val));
}
Затем просто перегружайте одинаковые методы для каждого примитивного типа, который вам нужен.
Ответ 2
Есть ли встроенная функция для зажима в диапазоне?
Нет.
Ответ 3
Портировано из .NET-ответа:
public static <T extends Comparable<T>> T clamp(T val, T min, T max) {
if (val.compareTo(min) < 0) return min;
else if (val.compareTo(max) > 0) return max;
else return val;
}
Предостережение: В отличие от .NET, примитивные типы не допускаются в generics, а это значит, что они должны быть в коробке/распакованном. При работе с примитивными типами, такими как int
и double
, в этой реализации будут выполняться три операции с полем и одна операция unbox.
Примечание: с его порта ответа .NET я сделал это публикацией сообщества wiki.
Ответ 4
Начиная с версии 21, Guava включает Ints.constrainToRange()
(и эквивалентные методы для других примитивов). Из примечания к выпуску:
добавлены методы constrainToRange([type] value, [type] min, [type] max)
, которые ограничивают заданное значение закрытым диапазоном, определяемым значениями min
и max
. Они возвращают значение, если оно находится в пределах диапазона, min
, если оно находится ниже диапазона и max
, если оно превышает диапазон.