​    ​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(12345); 
    HashSet setB = Sets.newHashSet(45678); 
        
    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);

这些仅仅是一个开始

使用guava带来的方便的更多相关文章

  1. 使用Guava EventBus构建publish/subscribe系统

    Google的Guava类库提供了EventBus,用于提供一套组件内publish/subscribe的解决方案.事件总线EventBus,用于管理事件的注册和分发.在系统中,Subscribers ...

  2. Guava Supplier实例

    今天想讲一下Guava Suppliers的几点用法.Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的对象都为同一个对象,但你和单例模式有所区别 ...

  3. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

  4. guava常用操作

    Jack47 我思故我在 Google Java编程库Guava介绍 本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含 ...

  5. 使用 Google Guava 美化你的 Java 代码

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...

  6. guava学习--Supplier Suppliers

    转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的 ...

  7. Guava 10-散列

    概述 Java内建的散列码[hash code]概念被限制为32位,并且没有分离散列算法和它们所作用的数据,因此很难用备选算法进行替换.此外,使用Java内建方法实现的散列码通常是劣质的,部分是因为它 ...

  8. [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  9. [置顶] Guava学习之ArrayListMultimap

    ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...

随机推荐

  1. 用python简单处理图片(4):图像中的像素访问

    前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作.如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了.因此,通常我们加载完图片后,都 ...

  2. [word]2010中插入公式自动编号并且公式不自动缩小/变小

    要实现在word2010中插入公式自动编号,就要用到自动图文集功能,具体操作如下: 1.先制定制表位位置:单击一个空白段落,然后双击标尺线的底部:这会激活"制表位"对话框,如图所示 ...

  3. 信息安全系统设计基础exp_4

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础 班级:1353 姓名:郑伟.吴子怡 学号:20135322.20135313 指导教师: 娄嘉鹏 实验 ...

  4. 如何在WPF中引用Windows.System.Forms.Integration

    转自 http://www.cnblogs.com/sinozhang1988/archive/2012/11/28/2792804.html “未找到程序集 WindowsFormsIntegrat ...

  5. ModernUI教程:使用预定义的页面布局

    Modern UI for WPF自带了一组页面布局.Modern UI page是继承自control控件的,Page通过是通过ModernWindow.MenuLinkGroups属性来引用显示在 ...

  6. ssh 返回错误 Too many authentic authentication failures for root 的时候检查 ssh 配置

    路径 cd /etc/ssh ls -ltr sudo vi sshd_config 改为以下内容(yes): PermitRootLogin yes

  7. Fluent NHibernate关系映射

    1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...

  8. AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器

    AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的 ...

  9. 软工实践练习一(个人)----将Androidstudio的项目共享到github

    在Androidstudio上使用git插件 将项目共享至github 将 显示共享成功但是出了点问题 项目文件并没有上传至github库中,而是只创建了一个新的库 问题在于我的gitforwindo ...

  10. NServiceBus 结合 RabbitMQ 使用

    参考官方教程: Step by Step Guide 新建4个项目: A Console Application named Client A Console Application named Se ...