java有钳位功能吗?

时间:2013-05-20 19:11:32

标签: java clamp

假设我有一个value,我通常会将其“钳制”到一个范围,此处为[0..1]范围。也就是说,如果它低于范围开始,则将其增加到范围开始,它高于范围结束,将其减小到范围结束。

clampedValue = Math.max(0, Math.min(1, value));

是否有用于夹紧范围的内置功能?

5 个答案:

答案 0 :(得分:151)

  

是否有用于夹紧范围的内置功能?

没有。

答案 1 :(得分:41)

看了另一个答案中提供的通用钳位方法,值得注意的是,这对原始类型有boxing/unboxing的考虑。

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 :(得分:14)

移植自a .NET answer

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不同,泛型中不允许使用原始类型,这意味着它们必须装箱/取消装箱。使用原始类型(例如intdouble)时,此实现将执行三个盒操作和一个unbox操作。

注意:由于它是the .NET answer的端口,我将其设为社区维基帖。

答案 3 :(得分:14)

从版本21开始,Guava包含Ints.constrainToRange()(以及其他基元的等效方法)。来自release notes

  

添加constrainToRange([type] value, [type] min, [type] max)方法,将给定值约束到minmax值定义的封闭范围。如果值在范围内,则返回值本身;如果值低于范围,则返回min;如果值超出范围,则返回max

答案 4 :(得分:1)

另一个不太漂亮,但可能的解决方案是使用三元运算符,这是if-then-else语句的简写。

一些例子:

// value must be between MIN_VALUE and MAX_VALUE
value = value > MAX_VALUE ? MAX_VALUE : value < MIN_VALUE ? MIN_VALUE : value;

// value must be between 0 and 10
value = value > 10 ? 10 : value < 0 ? 0 : value;