在这个特定的例子中,你最好不要使用Range
,而是set.subSet(4, true, 10, true)
直接使用,但可能你有一个更复杂的用例,你的代码是一个简化的例子。
除了自己处理所有案件之外,真的没有太多选择。部分问题是 aNavigableSet
可以使用任意Comparator
,但Range
(故意)仅适用于值类型的自然顺序,因此在 Guava 中提供一个采用任意Range
和 aNavigableSet
并与它们相交的方法会有些尴尬。
最通用的解决方案看起来像......
if (range.hasLowerBound()) {
if (range.hasUpperBound()) {
return set.subSet(
range.lowerEndpoint(),
range.lowerBoundType() == BoundType.CLOSED,
range.upperEndpoint(),
range.upperBoundType() == BoundType.CLOSED);
} else {
return set.tailSet(
range.lowerEndpoint(),
range.lowerBoundType() == BoundType.CLOSED);
}
} else {
if (range.hasUpperBound()) {
return set.headSet(
range.upperEndpoint(),
range.upperBoundType() == BoundType.CLOSED);
} else {
return set;
}
}
也就是说,值得一提的是,如果你不关心效率,你可以做Iterables.removeIf(set, Predicates.not(range))
or Sets.filter(set, range)
。