几个月前,我发现了JScience,尽管我正为一件事情而苦苦挣扎,但这对我的项目有很大帮助。
[我正在尝试创建一个PressureHead
(又称水柱)单位,该单位可以直接用Length
转换,也可以用给定Pressure
值的VolumetricDensity
间接转换。
寻找压力:Density × Gravity × Head = Pressure
这里是Wikipedia的转换示例:
1 cmH 2 O(4°C)= 999.9720千克/米3×9.80665m / s 2 1厘米= 98.063754138 Pa
1 cmH 2 O可以直接转换为1 cm。
假设我知道Pa的压力,并且想要找到mH 2] O的压力头,这是我在项目中最经常进行的转换。我还需要知道流体的密度。压力和密度是可变输入。公式也必须知道重力,但出于我的目的,可以将其固定为标准重力。
查找压力头:Pressure / (Density × Gravity) = Head
[为简单起见,我只是重新调整了上面示例中的值,将压力乘以100得到1 mH 2
O,而不是1 cmH 2 O。9806.3754138 Pa /(999.9720 kg / m 3
×9.80665 m / s 2)= 1 mH 2] O看起来JScience可能足够灵活以允许这样的单元,但是我还没有看到任何示例可以帮助我创建它。最坏的情况是,我可能只想通过util方法在它们之间进行转换。
编辑
一些我想看到的理想用法的例子:
// Pressure to PressureHead Amount<Pressure> pressure = Amount.valueOf(9806.3754138, PASCAL); Amount<VolumetricDensity> density = Amount.valueOf(999.9720, KG_M3); Amount<PressureHead> head = pressure.to(M_H2O, density); System.out.println(pressure.doubleValue(M_H2O, density)); // 1.0 // PressureHead <-> Length Amount<Length> length = head.to(METER); System.out.println(head.doubleValue(METER)); // 1.0 head = length.to(M_H2O); System.out.println(length.doubleValue(M_H2O)); // 1.0 // PressureHead to Pressure pressure = head.to(PASCAL, density); System.out.println(head.doubleValue(PASCAL, density)); // 9806.3754138
PressureHead
单位之间的转换很容易。我可以这样定义其他单位:Unit<PressureHead> FT_H2O = M_H2O.transform(FOOT.getConverterTo(METER));
对于上面的理想用法,我需要子类
Amount
并重载to()
和doubleValue()
。我怀疑是否存在一种更正确的转换方法(尽管用法不是很不错),它涉及子类化UnitConverter
和/或基于DerivedUnit
的类之一。[我的一部分想放弃,只走快速,简便(且丑陋)的util方法之路,这样我就可以继续从事更重要的事情,而我的另一部分则想找到一种使我爱上JScience的解决方案更多。
几个月前,我发现了JScience,尽管我正为一件事而苦苦挣扎,但这对我的项目有很大帮助。我正在尝试创建一个PressureHead(又名水柱)单元,该单元可以是...
尽管此刻我不再需要进行这种转换,但在将大部分项目(除UI代码之外的所有项目)转换为Kotlin并找到了喜欢Kotlin的原因之后,我正在重新讨论此问题。我之所以做出切换,是因为我认为这是一个很好的机会,可以在项目仍处于初期阶段时学习该语言。因此,这不能完全回答我过去想要Java答案的自我,但是我现在的自我很乐意接受此答案。
此解决方案利用Kotlin的extension functions。