Java中的箝位函數
1. 概述
箝位功能將值限制在某個範圍內。它確保給定值不會超出特定的下限和上限。
在本教程中,我們將通過示例探討如何在 Java 中實現箝制功能。
2. Java 21之前的clamp函數
在 Java 21 之前,Java 沒有內置函數來限制值。我們需要自己編寫箝位函數。
箝位函數指定值的範圍。低於最小值的值將設置為最小值。高於最大值的值將設置為最大值。此外,該範圍內的值也會自行返回。
2.1.使用方法重載
我們可以使用方法重載來實現針對不同數據類型的clamp功能。
讓我們創建一個Clamp
類並添加一個返回整數的clamp()
方法:
class Clamp {
int clamp(int value, int min, int max) {
return Math.max(min, Math.min(max, value));
}
}
在這裡,我們創建一個clamp()
方法,它接受值、下限和上限作為參數。此外,我們使用Math
類來設置最小值和最大值。最後,如果該值在設定範圍內,則返回該值;如果該值不在該範圍內,則返回最小值或最大值。
讓我們為clamp()
方法編寫一個單元測試:
@Test
void givenValueOutsideRange_whenClamp_thenReturnLowerValue() {
Clamp clampValue = new Clamp();
assertEquals(15, clampValue.clamp(10, 15, 35));
}
在這裡,我們創建一個Clamp
實例並在其上調用clamp()
。該值設置為10
,最小值設置為15,
最大值設置為35
。由於該值不在範圍內,因此該方法返回最小值。
這是對該範圍內的值的測試:
assertEquals(20, clampValue.clamp(20, 15, 35));
由於輸入值落在該範圍內,因此clamp()
方法返回該值。
最後,讓我們看看對高於最大值的值的測試:
assertEquals(35, clampValue.clamp(50, 15, 35));
這裡,輸入值超出了最大邊界。因此, clamp()
方法返回最大值。
此外,我們通過重載clamp()
方法來實現double
數據類型的clamp函數:
double clamp(double value, double min, double max) {
return Math.max(min, Math.min(max, value));
}
在這裡,我們用double
數據類型重載clamp()
。此外,該方法返回一個double
。
2.2.使用泛型
此外,我們可以使用泛型使clamp()
方法更加靈活並可以處理不同的數據類型:
static <T extends Comparable<T>> T clamp(T value, T min, T max) {
if (value.compareTo(min) < 0) {
return min;
} else if (value.compareTo(max) > 0) {
return max;
} else {
return value;
}
}
上面的方法採用三個泛型類型T. T
還實現了Comparable
接口。然而,這種方法可能很昂貴。如果最小值和最大值是基本類型, Java 會自動將它們裝箱為等效對象,因為基本類型無法實現Comparable
。
讓我們為泛型方法編寫一個單元測試:
@Test
void givenFloatValueWithinRange_whenClamp_thenReturnValue() {
Clamp clampValue = new Clamp();
assertEquals(16.2f, clampValue.clamp(16.2f, 15f, 35.3f));
}
該方法接受float
類型,但在計算值時,它將float
裝箱為Float
,然後將返回值從Float
拆箱為float
。因此,我們有兩次裝箱操作和一次拆箱操作。
建議重載方法以避免裝箱/拆箱操作。
3. Java 21之後的clamp函數
仍處於實驗階段的Java 21在Math
類中引入了clamp()
方法。這個方法可以很容易地限制一個值,而無需編寫我們自己的方法。
下面是在 Java 21 中使用clamp()
的示例:
@Test
void givenValueWithinRange_whenClamp_thenReturnValue() {
assertEquals(20, Math.clamp(20, 67, 98));
}
在上面的代碼中,我們調用clamp()
方法並設置最小值和最大值。該代碼返回該值,因為它在最小值和最大值之內。
值得注意的是, clamp()
方法支持不同的數據類型。因此,不需要針對不同的數據類型進行顯式實現。
4。結論
在本文中,我們學習了三種不同的方法來在Java中實現clamp功能。在Java 21在標準庫中引入clamp()
方法之前,我們已經了解瞭如何編寫clamp clamp()
方法。
與往常一樣,示例的源代碼可 在 GitHub 上獲取。