链接地址:http://www.xx566.com/detail/148.html
上一篇Guava库学习:学习Collections(七)Table中, 我们学习了Guava定义的Table数据结构,用于解决Map<R,Map<C,V>>这种复杂集合结构的遍历与取值问题,本 篇我们学习一种新的类型Range(区间),Range的源码中这样解释:A range (or "interval") defines the boundaries around a contiguous span of values of some Comparable type ,大意就是:为一个可比较类型连续的值定义连续边界。
首先,阅读Guava Range的源码,我们整理一下其中的公共方法,来研究一下Range的使用及其作用,数学上关于区间的定义,经常有开闭原则,Range的定义中也涉及一些数学知识,这里不再赘述,源码中公共方法整理如下:
Range open(C lower, C upper):返回一个Range,包含严格大于lower小于upper范围的所有值,数学表示(lower,upper)
Range closed(C lower, C upper):返回一个Range,包含大于等于lower小于等于upper范围的所有值,数学表示 [ lower,upper ]
Range closedOpen( C lower, C upper):返回一个Range,包含大于等于lower严格小于upper范围的所有值,数学表示 [ lower,upper )
Range openClosed( C lower, C upper):返回一个Range,包含严格大于lower小于等于upper范围的所有值,数学表示 (lower,upper ]
Range range( C lower, BoundType lowerType, C upper, BoundType upperType):返回一个Range,包含lower和upper范围的所有值,临界值的开闭可以通过BoundType设置,BoundType 是枚举类型,标识开闭。
Range lessThan(C endpoint):返回严格小于endpoint的所有值Range
Range atMost(C endpoint):返回小于等于endpoint的所有值Range
Range upTo( C endpoint, BoundType boundType):返回上限临界值为endpoint的区间,上限开闭性由boundType指定
Range greaterThan(C endpoint):返回严格大于endpoint的所有值Range
Range atLeast(C endpoint):返回大于等于endpoint的所有值Range
Range downTo( C endpoint, BoundType boundType):返回下限临界值为endpoint的区间,下限开闭性由boundType指定
Range all():返回包含类型C所有值的Range
Range singleton(C value):返回唯一包含传入value的Range
Range encloseAll( Iterable values):返回Range与传入values比较后的最小范围区间
boolean hasLowerBound():返回Range是否存在下限
C lowerEndpoint():返回Range下限的临界点值
BoundType lowerBoundType():返回Range的下限类型BoundType,即开闭性
boolean hasUpperBound():返回Range是否存在上限
C upperEndpoint():返回Range上限的临界点值
BoundType upperBoundType():返回Range的上限类型BoundType,即开闭性
boolean isEmpty():判断Range是否为空,即上下限是否相等
boolean contains(C value):判断Range中是否包含指定的value
boolean containsAll(Iterable<? extends C> values):判断指定values中是否所有值都包含在Range中
boolean encloses(Range other):返回传入Range是否包含在调用此方法的Range中
boolean isConnected(Range other):返回两个Range是否能够连续上
Range intersection(Range connectedRange):返回两个Range的最大交集,如果Range无交集,抛出异常IllegalArgumentException
Range span(Range other):返回两个Range的并集
Range canonical(DiscreteDomain domain):返回在给定domain离散域下Range的规范形式
Range提供的方法很多,也都很简单,我们这里不再依次进行代码示例,我们针对Range的应用场景,简单的写一个示例来进行学习,如下:
package guava; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Range; /** * Range:为一个可比较类型连续的值定义连续边界 * User: Realfighter * Date: 2014/10/16 * Time: 22:18 */ public class RangeTest { public static void main(String[] args) { //定义一个返回Person年龄的函数 Function<Person, Integer> ageFunction = new Function<Person, Integer>() { @Override public Integer apply(Person input) { return input.getAge(); } }; //定义一个年龄大于等于25小于30岁的区间 Range<Integer> ageRange = Range.closedOpen(25, 30); //定义一个对于指定区间年龄Person的过滤 // 注:Range实现了Predicate接口,所以compose方法可以接口ageRange Predicate<Person> personPredicate = Predicates.compose(ageRange, ageFunction); Person person = new Person("张三", 30); System.out.println(personPredicate.apply(person));//false,不在区间内 } } //Person实现了Comparable接口,当我们需要选择一定年龄区间的Person时 // 通过Comparable比较显然麻烦许多,这时候可以使用Range class Person implements Comparable<Person> { private Integer age;//年龄 private String name;//名称 @Override public int compareTo(Person o) { //使用Guava提供的ComparisonChain进行对象的链式比较 return ComparisonChain.start() .compare(this.name, o.getName()) .compare(this.age, o.getAge()).result(); } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } Person(String name, Integer age) { this.name = name; this.age = age; } }
更多ComparisonChain,请参阅:Guava库学习:Guava中ComparisonChain类的学习和使用
更多Functions,请参阅:Guava库学习:函数编程(一)使用Function和Functions进行对象转换
更多Predicates,请参阅:Guava库学习:函数编程(二)使用Predicate和Predicates进行对象过滤