使用guava带来的方便

    ​    ​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);

这些仅仅是一个开始

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值