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

gen*_* b. 6 java

我知道对于整数,Java 8有IntStream,它允许你生成范围并检查它们,例如

IntStream range = IntStream.rangeClosed(5,10);
range.anyMatch(x -> x == 4);
Run Code Online (Sandbox Code Playgroud)

我的问题是我有双范围,定义为:

Light     [0, 3.0)
Moderate  [3.0, 6.0)
Vigorous  >= 6.0
Run Code Online (Sandbox Code Playgroud)

根据这些范围检查的变量是a double val.我只是想知道Java 8是否有任何方便的解决方案.if/else出于各种原因,我不想使用复杂的树木.

Jac*_* G. 5

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

我必须模拟范围的一个建议是使用 a 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());
Run Code Online (Sandbox Code Playgroud)

输出:

MODERATE
Run Code Online (Sandbox Code Playgroud)

您可以随意处理超出范围的值,以及Double.NaN.