我只在 Java 测量单位标准的 Indriya 2.0.4 参考实现 中看到公制单位。当然其他人也想用英尺、英寸和英里来工作,但我找不到任何相关信息。谁能告诉我我在这里缺少什么?
我可以做
Quantity<Mass> weight = Quantities.getQuantity(1, Units.KILOGRAM);
,那么Quantity<Mass> weight = Quantities.getQuantity(1, Units.POUND);
在哪里?
对于比 SI 单位更广泛的测量,您可以使用 Units ofMeasurement 项目中的一些其他 API(其中包括
indriya
API)。
具体来说,
CLDR
和 USCustomary
类可能会令人感兴趣。然而,我还没有成功地将不同类别的单元结合起来,例如用于转换(请参阅下面注释掉的代码)。
一些例子:
import javax.measure.Quantity;
import javax.measure.quantity.Length;
import javax.measure.quantity.Mass;
import systems.uom.unicode.CLDR;
import systems.uom.common.USCustomary;
import tec.units.ri.quantity.Quantities;
import tec.units.ri.unit.Units;
...
Quantity<Mass> weight1 = Quantities.getQuantity(1, Units.KILOGRAM);
Quantity<Mass> weight2 = Quantities.getQuantity(1, USCustomary.POUND);
// javax.measure.IncommensurableException: kg is not compatible with lb
//Double d2 = Units.KILOGRAM.getConverterTo(CLDR.POUND).convert(1);
Quantity<Mass> weight3 = Quantities.getQuantity(123.45, CLDR.GRAM);
Quantity<Mass> weight4 = Quantities.getQuantity(123.45, CLDR.OUNCE);
Quantity<Mass> weight5 = Quantities.getQuantity(123.45, CLDR.OUNCE_TROY);
Double ounces = CLDR.GRAM.getConverterTo(CLDR.OUNCE)
.convert(weight3.getValue()).doubleValue();
System.out.println(weight3.getValue() + " grams = " + ounces + " ounces");
Quantity<Length> dist1 = Quantities.getQuantity(123.45, CLDR.KILOMETER);
Double miles = CLDR.KILOMETER.getConverterTo(CLDR.MILE)
.convert(dist1.getValue()).doubleValue();
System.out.println(dist1.getValue() + " kilometers = " + miles + " miles");
上述示例的输出是:
123.45 grams = 4.354570602675702 ounces
123.45 kilometers = 76.70827368169888 miles
我的 POM 依赖项是:
<dependencies>
<dependency>
<groupId>javax.measure</groupId>
<artifactId>unit-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>tec.units</groupId>
<artifactId>unit-ri</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>systems.uom</groupId>
<artifactId>systems-unicode</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>systems.uom</groupId>
<artifactId>systems-common</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>systems.uom</groupId>
<artifactId>systems-quantity</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
我创建了一个开源 Unitility 库,用于处理物理量和测量单位,包括它们之间的轻松转换。使用示例:
// Creating temperature instance of specified units
Temperature temperature = Temperature.ofCelsius(20.5); // {20.50 °C}
// Getting converted value for calculations
double valueInCelsius = temperature.getInCelsius(); // 20.50 °C
double valueInFahrenheits = temperature.getInFahrenheits(); // 68.90 °F
// Checking property current unit, value, and value in base unit
TemperatureUnits unit = temperature.getUnit(); // CELSIUS
TemperatureUnits baseUnit = unit.getBaseUnit(); // KELVIN
// Changing property unit and converting back to base unit
Temperature tempInFahrenheits = temperature.toUnit(TemperatureUnits.FAHRENHEIT);
Temperature tempInKelvins = temperature.toBaseUnit();
此外,相同类型的数量内支持逻辑和基本数学运算:
// Logic operation example:
Temperature smallerTemp = Temperature.ofCelsius(-20.0);
Temperature greaterTemp = Temperature.ofCelsius(0.0);
smallerTemp.isLowerThan(greaterTemp);
greaterTemp.isGreaterThan(smallerTemp);
// Math operation example:
Temperature sourceTemperature = Temperature.ofCelsius(20);
Temperature temperatureToAdd = Temperature.ofKelvins(293.15);
Temperature actualTemperature = sourceTemperature.add(temperatureToAdd); // {40°C}
它包括各种 SI 和英制单位,但它的设计方式是,在使用 PhysicalQuantity 时您不必关心它。您可以使用 SI 或英制单位定义任何数量,但在内部它会转换为基本单位。当您想要提取特定单位的值时,您只需选择代表给定数量类型所需单位 SI 或英制的正确方法即可。 库具有 SpringBoot 和 Quarkus 支持的模块以及 Jakarta 验证器的模块,这在 Web 应用程序中可能有用,例如:
@GetMapping("/dry-air")
DryAirResponse getDryAir(@RequestParam @PhysicalRange(min = "-150oC", max = "100F") Temperature temperature);
如果您需要为您的工程领域添加任何特定的单元集,请告诉我!