Guava库学习:学习Collections(八)Range

    链接地址: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进行对象过滤

你可能感兴趣的:(guava,Collections,range)