java有钳位function吗?
假设我有一个value
,我通常这样做是为了将它“夹”到一个范围,这里的范围是[0..1]
。 也就是说,如果它低于范围起点,将其增加到范围起点,高于范围终点,将其减小到范围终点。
clampedValue = Math.max(0, Math.min(1, value));
是否有内置的function夹紧到一个范围?
是否有内置的function夹紧到一个范围?
没有。
查看了另一个答案中提供的通用钳位方法后,值得注意的是,这对于原始types具有装箱/拆箱的考虑。
public static <T extends Comparable<T>> T clamp(T val, T min, T max) {...} float clampedValue = clamp(value, 0f, 1f);
这将使用Float
包装类,产生3个盒子操作,每个参数一个,返回types1个unbox操作。
为了避免这种情况,我只需要坚持长时间写它,或者使用非generics函数来获得所需的types:
public static float clamp(float val, float min, float max) { return Math.max(min, Math.min(max, val)); }
然后用相同的方法为每个需要的基本types重载。
从.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不同,基本types在generics中是不允许的,这意味着它们必须是盒装/非盒装的。 在使用基本types(如int
和double
,此实现将执行三个框操作和一个unbox操作。
注意:因为它是.NET解决scheme的一个端口, 所以我将其制作为社区wiki文章。
从版本21开始, Guava包含Ints.constrainToRange()
(和其他原语的等价方法)。 从发行说明 :
添加了
constrainToRange([type] value, [type] min, [type] max)
方法,该方法将给定值限制在由min
和max
定义的封闭范围内。 如果它在范围内,则它们自己返回值,如果它在范围之下,则返回min
如果在范围之上,则返回max
。