guava是在原先google-collection 的基础上发展过来的,是一个比较优秀的外部开源包,最近项目中使用的比较多,列举一些点。刚刚接触就被guava吸引了。。。
这个是guava的一个官网ppt里面的介绍:
1 2 3 4 5 | 其实你可能发现,一些基本的校验完全可以自己写,但是。。 这些东西仅仅是看起来比较简单,实际上可能比我们想想的要复杂; 用一个公共的lib,别人可能更加容易理解你的代码; 当你用一个主流的开源包的时候,你可能在主流中; 当你发现一个可以提升的点的 时候,如果仅仅是修改自己的私有包,可能没有多少人能够受益; |
1、非空检查,参数在赋值的时候就做一个检查
1 2 | String inputName = "iamzhongyong" ; String name = Preconditions.checkNotNull(inputName); |
这个减少了代码行数,认为变量必须赋值才可以使用。
多条件校验
1 2 | String inputName = "iamzhongyong" ; Preconditions.checkArgument(inputName!= null && ! "" .equals(inputName), "input is null" ); |
能够有效的减少代码行数
此外Preconditions中还有多个校验方法,可以优雅的进行判断了。
2、优雅的使用null
空指针异常是我们再写代码的时候经常遇到的,guava提供了Optional来让你不得不思考null的问题
Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则立刻报错。
Optional.absent():获得一个Optional对象,其内部包含了空值,内部代码看,是返回了Absent的一个实例。
Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空[Optional.fromNullable(null),和Optional.absent()等价。
1 2 3 4 | Optional<String> name = Optional.of( "iamzhongyong" ); if (name.isPresent()){ System.out.println(name.get()); } |
3、Object中常用的方法
例如我们常见的equals方法和hashCode方法,Objects中都有与之对应的方法提供;
同时,toString是我们比较常用的,Objects.toStringHelper方法十分方便
1 2 3 4 5 6 7 8 | public class StringHelp { public String name; public int age; @Override public String toString() { return Objects.toStringHelper( this ).add( "name" , this .name).add( "age" , this .age).toString(); } } |
4、字符转链接(Joiner 类)
1 2 3 4 5 6 7 8 | public static void main(String[] args) { List<String> names = Lists.newArrayList(); names.add( "iamzhongyong" ); names.add( "bixiao.zy" ); StringBuilder sb = new StringBuilder(); String rs = Joiner.on( "--" ).appendTo(sb, names).toString(); System.out.println(rs); } |
5、字符串分隔符
这个时候你可能说JDK自己有分割器,但是其实guava这个更加灵活,其实JDK的那个性能不咋滴
1 2 3 4 5 6 | public static void main(String[] args) { String s = "dd sfsfs , dsfsf,ssfdfsdffsdfsf.sdfsfs,msfds" ; for (String name : Splitter.on( "," ).trimResults().split(s)){ System.out.println(name); } } |
6、不可变的集合(Immutable)
这里就拿一个map为例子,初始化一个集合,然后向里面放置几个不变的集合
1 2 3 | Map<Integer,String> mapa = new HashMap<Integer,String>(); mapa.put( 122 , "iamzhongyong" ); mapa.put( 1222 , "bixiao.zy" ); |
现在用Immutable就可以很简单的完成了
1 2 | ImmutableMap<Integer, String> map = ImmutableMap.of( 122 , "iamzhongyong" , 1222 , "bixiao.zy" ); System.out.println(map.toString()); |
7、一个key对应多个Valve的情况
我们经常遇到这种,一个key有多个value的情况,一般的做法如下:Map<Key,List<Value>>的数据结构去搞,
但是现在又办法了,可以使用Multimap来解决这个问题,简洁明了
1 2 3 4 5 | Multimap<Integer, String> keyValues = ArrayListMultimap.create(); keyValues.put( 1 , "a" ); keyValues.put( 1 , "b" ); keyValues.put( 2 , "c" ); System.out.println(keyValues.toString()); |
8、本地缓存
guava的缓存设计的比较巧妙,这里就简单介绍一下,guava的缓存创建分为两种,一种是CacheLoader的方式,一种是callback的方式
参数的话就不多介绍了,直接在CacheBuilder中可以看到,类似这个
1 2 3 4 5 | CacheBuilder.newBuilder() .maximumSize( 10 ) .initialCapacity( 3 ) .expireAfterWrite( 10 , TimeUnit.SECONDS) .build(); |
下面这个例子是callback的形式
1 2 3 4 5 6 7 8 9 10 11 12 | public void getNameFromLocalCache() throws Exception{ //new一个cache的对象出来 Cache<String /*name*/,String/*nick*/ > cache = CacheBuilder.newBuilder().maximumSize( 10 ).build(); //在get的时候,如果缓存里面没有,则通过实现一个callback的方法去获取 String name = cache.get( "bixiao" , new Callable<String>() { public String call() throws Exception { return "bixiao.zy" + "-" + "iamzhongyong" ; } }); System.out.println(name); System.out.println(cache.toString()); } |
下面这个例子是LoadingCache的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public void getNameLoadingCache(String name) throws Exception{ LoadingCache<String, String> cache = CacheBuilder.newBuilder() //设置大小,条目数 .maximumSize( 20 ) //设置失效时间,创建时间 .expireAfterWrite( 20 , TimeUnit.SECONDS) //设置时效时间,最后一次被访问 .expireAfterAccess( 20 , TimeUnit.HOURS) //移除缓存的监听器 .removalListener( new RemovalListener<String, String>() { public void onRemoval(RemovalNotification<String, String> notification) { System.out.println( "有缓存数据被移除了" ); }}) //缓存构建的回调 .build( new CacheLoader<String, String>(){ //加载缓存 @Override public String load(String key) throws Exception { return key + "-" + "iamzhongyong" ; } }); System.out.println(cache.get(name)); cache.invalidateAll(); } |
9、集合 并集、交集、补集的方法
1 2 3 4 5 6 7 8 9 10 11 | HashSet setA = Sets.newHashSet( 1 , 2 , 3 , 4 , 5 ); HashSet setB = Sets.newHashSet( 4 , 5 , 6 , 7 , 8 ); SetView union = Sets.union(setA, setB); System.out.println(union); SetView difference = Sets.difference(setA, setB); System.out.println(difference); SetView intersection = Sets.intersection(setA, setB); System.out.println(intersection); |
这些仅仅是一个开始