Guava Range类
精华
小牛编辑
186浏览
2023-03-14
1 什么是Guava Range类
Range 代表一个区间或一个序列。它用于获取位于特定范围内的一组数字/字符串。
2 Guava Range类的语法
@GwtCompatible
public final class Range<C extends Comparable>
extends Object
implements Predicate<C>, Serializable
3 Guava Range类的方法
方法 | 描述 |
---|---|
static <C extends Comparable<?>> Range<C> all() | 返回一个包含类型 C 的每个值的范围。 |
boolean apply(C input)Deprecated | 仅提供满足 Predicate 接口;使用 contains(C) 代替。 |
static <C extends Comparable<?>> Range<C> atLeast(C endpoint) | 返回一个包含所有大于或等于端点的值的范围。 |
static <C extends Comparable<?>> Range<C> atMost(C endpoint) | 返回包含所有小于或等于端点的值的范围。 |
Range<C> canonical(DiscreteDomain<C> domain) | 返回给定域中此范围的规范形式。 |
static <C extends Comparable<?>> Range<C> closed(C lower, C upper) | 返回一个范围,其中包含大于或等于下限且小于或等于上限的所有值。 |
static <C extends Comparable<?>> Range<C> closedOpen(C lower, C upper) | 返回一个范围,其中包含大于或等于下限且严格小于上限的所有值。 |
boolean contains(C value) | 如果值在此范围的范围内,则返回 true。 |
boolean containsAll(Iterable<? extends C> values) | 如果 values 中的每个元素都包含在此范围内,则返回 true。 |
static <C extends Comparable<?>> Range<C> downTo(C endpoint, BoundType boundType) | 返回给定端点的范围,可以是包含(封闭)或不包含(开放),没有上限。 |
static <C extends Comparable<?>> Range<C> encloseAll(Iterable<C> values) | 返回包含所有给定值的最小范围。 |
boolean encloses(Range<C> other) | 如果 other 的边界没有超出此范围的边界,则返回 true。 |
boolean equals(Object object) | 如果 object 是具有与此范围相同的端点和绑定类型的范围,则返回 true。 |
static <C extends Comparable<?>> Range<C> greaterThan(C endpoint) | 返回一个包含严格大于端点的所有值的范围。 |
int hashCode() | 返回此范围的哈希码。 |
boolean hasLowerBound() | 如果此范围具有较低的端点,则返回 true。 |
boolean hasUpperBound() | 如果此范围具有上端点,则返回 true。 |
Range<C> intersection(Range<C> connectedRange) | 如果存在这样的范围,则返回此范围和 connectedRange 所包含的最大范围。 |
boolean isConnected(Range<C> other) | 如果存在一个(可能是空的)范围被这个范围和其他范围包围,则返回 true。 |
boolean isEmpty() | 如果此范围的形式为 [v..v) 或 (v..v],则返回 true。 |
static <C extends Comparable<?>> Range<C> lessThan(C endpoint) | 返回一个包含严格小于端点的所有值的范围。 |
BoundType lowerBoundType() | 返回此范围下限的类型:如果范围包括其下端点,则为 BoundType.CLOSED,否则为 BoundType.OPEN。 |
C lowerEndpoint() | 返回此范围的下端点。 |
static <C extends Comparable<?>> Range<C> open(C lower, C upper) | 返回一个范围,其中包含严格大于下限和严格小于上限的所有值。 |
static <C extends Comparable<?>> Range<C> openClosed(C lower, C upper) | 返回一个范围,其中包含严格大于下限且小于或等于上限的所有值。 |
static <C extends Comparable<?>> Range<C> range(C lower, BoundType lowerType, C upper, BoundType upperType) | 返回一个包含从低到高的任何值的范围,其中每个端点可以是包含的(封闭的)或不包含的(开放的)。 |
static <C extends Comparable<?>> Range<C> singleton(C value) | 返回仅包含给定值的范围。 |
Range<C> span(Range<C> other) | 返回包含此范围和其他范围的最小范围。 |
String toString() | 返回此范围的字符串表示形式,例如“[3..5)”(其他示例在类文档中列出)。 |
BoundType upperBoundType() | 返回此范围上限的类型:如果范围包括其上端点,则为 BoundType.CLOSED,如果不包括,则为 BoundType.OPEN。 |
C upperEndpoint() | 返回此范围的上端点。 |
static <C extends Comparable<?>> Range<C> upTo(C endpoint, BoundType boundType) | 返回到给定端点的没有下限的范围,该范围可以是包含的(封闭的)或排除的(开放的)。 |
5 Guava Range类的例子
让我们看一个简单的Guava Range类示例。
package cn.xnip;
import com.google.common.collect.ContiguousSet;
import com.google.common.collect.DiscreteDomain;
import com.google.common.collect.Range;
import com.google.common.primitives.Ints;
public class GuavaTester {
public static void main(String args[]) {
GuavaTester tester = new GuavaTester();
tester.testRange();
}
private void testRange() {
//create a range [a,b] = { x | a <= x <= b}
Range<Integer> range1 = Range.closed(0, 9);
System.out.print("[0,9] : ");
printRange(range1);
System.out.println("5 is present: " + range1.contains(5));
System.out.println("(1,2,3) is present: " + range1.containsAll(Ints.asList(1, 2, 3)));
System.out.println("Lower Bound: " + range1.lowerEndpoint());
System.out.println("Upper Bound: " + range1.upperEndpoint());
//create a range (a,b) = { x | a < x < b}
Range<Integer> range2 = Range.open(0, 9);
System.out.print("(0,9) : ");
printRange(range2);
//create a range (a,b] = { x | a < x <= b}
Range<Integer> range3 = Range.openClosed(0, 9);
System.out.print("(0,9] : ");
printRange(range3);
//create a range [a,b) = { x | a <= x < b}
Range<Integer> range4 = Range.closedOpen(0, 9);
System.out.print("[0,9) : ");
printRange(range4);
//create an open ended range (9, infinity
Range<Integer> range5 = Range.greaterThan(9);
System.out.println("(9,infinity) : ");
System.out.println("Lower Bound: " + range5.lowerEndpoint());
System.out.println("Upper Bound present: " + range5.hasUpperBound());
Range<Integer> range6 = Range.closed(3, 5);
printRange(range6);
//check a subrange [3,5] in [0,9]
System.out.println("[0,9] encloses [3,5]:" + range1.encloses(range6));
Range<Integer> range7 = Range.closed(9, 20);
printRange(range7);
//check ranges to be connected
System.out.println("[0,9] is connected [9,20]:" + range1.isConnected(range7));
Range<Integer> range8 = Range.closed(5, 15);
//intersection
printRange(range1.intersection(range8));
//span
printRange(range1.span(range8));
}
private void printRange(Range<Integer> range) {
System.out.print("[ ");
for(int grade : ContiguousSet.create(range, DiscreteDomain.integers())) {
System.out.print(grade +" ");
}
System.out.println("]");
}
}
输出结果为: