Java 8 - 检查 Double 是否在范围内?

6
我知道对于整数,Java 8有IntStream可以生成范围并检查它们。例如:
IntStream range = IntStream.rangeClosed(5,10);
range.anyMatch(x -> x == 4);

我的问题是我有双重范围,定义如下:

Light     [0, 3.0)
Moderate  [3.0, 6.0)
Vigorous  >= 6.0

被检查范围的变量是一个 double val。我想知道 Java 8 是否有方便的解决方法。我不想使用复杂的 if/else 树,由于种种原因。


6
IntStream.rangeClosed(5,10)返回一个流,其中只包含整数5, 6, 7, 8, 9, 10。如果使用Double类型的流“range”,您期望得到什么结果?您肯定不希望在端点之间返回_每个可能的Double_吧? - k_ssb
这似乎不是您所谓的“范围”的好用法。IntStream实际上就是整数值的流。anyMatch正在检查该范围中的每个值是否与提供的谓词匹配。对于浮点数值,这意味着什么并不清楚。 - Oliver Charlesworth
2
如果你还不知道的话,Guava的Range类可能会很适合你。虽然它并不是一个全新的Java 8解决方案。 - Marvin
Range getRange(double x){ if(x >= 0 && x < 3) return Range.LIGHT; if(x >= 3 && x < 6) return Range.MODERATE; return Range.VIGOROUS; }有什么不好的呢?假设您有一个包含上述常量的Range枚举。 - Ousmane D.
Aomine - 我在每个if/else中重复数字;如果我添加新的类别,那么维护代码的清晰度就不够了;使用范围解决方案会更加优雅。 - gene b.
1个回答

6

正如pkpnd在他们的评论中所述,一个int和下一个之间存在已知差异(例如45相隔一个整数)。然而,两个任意double之间有多远的距离,即ulp?

我建议模拟一个范围的方法是使用NavigableMap

enum Range {
    LIGHT, MODERATE, VIGOROUS, UNKNOWN
}

NavigableMap<Double, Range> map = new TreeMap<>();

map.put(Double.NEGATIVE_INFINITY, Range.UNKNOWN);
map.put(0D, Range.LIGHT);
map.put(3D, Range.MODERATE);
map.put(6D, Range.VIGOROUS);

System.out.println(map.floorEntry(4D).getValue());

输出:

MODERATE

你可以自由处理超出范围的值,以及 Double.NaN


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接