使用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(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);

?

这些仅仅是一个开始

时间: 2024-10-09 16:07:32

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

guava学习--Supplier Suppliers

转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的对象都为同一个对象,但你和单例模式有所区别,Suppliers具备更加迷人的色彩. Lazy初始化,Supplier wrapped的对象只在第一次get时候会被初始化 public void should_init_the_supplier_wrapped_object_when_get_obje

让开发效率爆表的Guava ---- 基础工具篇

使用现成的库的原因, 既能减少自己开发所带来的bug, 同时又大大提高了开发效率, 当然这也是Java语言流行的一个原因----拥有海量的开源包. 本篇从Guava基础工具入手开始介绍这个广泛使用的库: package com.wenniuwuren.guava; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.HashMap; import com.google.commo

Guava 10-散列

概述 Java内建的散列码[hash code]概念被限制为32位,并且没有分离散列算法和它们所作用的数据,因此很难用备选算法进行替换.此外,使用Java内建方法实现的散列码通常是劣质的,部分是因为它们最终都依赖于JDK类中已有的劣质散列码. Object.hashCode往往很快,但是在预防碰撞上却很弱,也没有对分散性的预期.这使得它们很适合在散列表中运用,因为额外碰撞只会带来轻微的性能损失,同时差劲的分散性也可以容易地通过再散列来纠正(Java中所有合理的散列表都用了再散列方法).然而,在简

第二章 Google guava cache源码解析1--构建缓存器

1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHashMap(或者说成就是一个ConcurrentHashMap,只是在其上多添加了一些功能) 2.使用实例 具体在实际中使用的例子,去查看<第七章 企业项目开发--本地缓存guava cache>,下面只列出测试实例: import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit;

Guava ---- EventBus事件驱动模型

在软件开发过程中, 难免有信息的共享或者对象间的协作. 怎样让对象间信息共享高效, 而且耦合性低. 这是一个难题. 而耦合性高将带来编码改动牵一发而动全身的连锁效应. Spring的风靡正是由于攻克了高耦合问题. 本篇介绍的EventBus中也用到了Spring中的依赖注入. 来进行对象和对象间的解耦(如@Subscribe). Guava解决高耦合採用的是事件驱动模型的思路. 对象能够订阅(subscribe)特定的事件或者公布(publish)特定的事件去被消费. 从以下的代码能够看出, E

Guava学习笔记:Optional优雅的使用null

在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上的优雅和简单.  null代表不确定的对象: Java中,null是一个关键字,用来标识一个不确定的对象.因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量. Java中,变量的使用都遵循一个原则:先定义,并且初始化后,才可以使用.例如如下代码中,我们不能定义int age后,不

Guava 教程1-使用 Google Collections,Guava,static imports 编写漂亮代码

文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMPORTS 编写漂亮代码 1.Google Collections一览 2.操作lists和maps 3.静态导入和Eclipse模板 4.Guava走马观花 2-深入探索 GOOGLE GUAVA 库 1.The Guava CharMatcher 2.Joiner and Splitter 3.W

让开发效率爆表的Guava ---- Table矩阵

使用Guava对矩阵的实现, 做一些矩阵存贮等操作将大大提高效率, 而不是自己用JDK的Array去实现, 可能带来不少bug, 而且增加代码复杂度. package com.wenniuwuren.collections; import java.util.Map; import com.google.common.collect.HashBasedTable; /** * Table: 矩阵的实现 * @author wenniuwuren * */ public class TableTe

让开发效率爆表的Guava ---- EventBus事件驱动模型

在软件开发过程中, 难免有信息的共享或者对象间的协作. 如何让对象间信息共享高效, 并且耦合性低, 这是一个难题. 而耦合性高将带来编码修改牵一发而动全身的连锁效应, Spring的风靡正是因为解决了高耦合问题. 本篇介绍的EventBus中也用到了Spring中的依赖注入, 来进行对象和对象间的解耦(如@Subscribe). Guava解决高耦合采用的是事件驱动模型的思路, 对象可以订阅(subscribe)特定的事件或者发布(publish)特定的事件去被消费. 从下面的代码可以看出, E