首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

使用guava带到的方便

2013-12-26 
使用guava带来的方便原文:http://iamzhongyong.iteye.com/blog/1981199?guava是在原先google-collection

使用guava带来的方便

原文:http://iamzhongyong.iteye.com/blog/1981199

?guava是在原先google-collection 的基础上发展过来的,是一个比较优秀的外部开源包,最近项目中使用的比较多,列举一些点。刚刚接触就被guava吸引了。。。

??????????这个是guava的一个官网ppt里面的介绍:

12345其实你可能发现,一些基本的校验完全可以自己写,但是。。这些东西仅仅是看起来比较简单,实际上可能比我们想想的要复杂;用一个公共的lib,别人可能更加容易理解你的代码;当你用一个主流的开源包的时候,你可能在主流中;当你发现一个可以提升的点的 时候,如果仅仅是修改自己的私有包,可能没有多少人能够受益;

?

1、非空检查,参数在赋值的时候就做一个检查

12String inputName =?"iamzhongyong";String name = Preconditions.checkNotNull(inputName);

这个减少了代码行数,认为变量必须赋值才可以使用。

多条件校验

12String 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()等价。

1234Optional<String> name = Optional.of("iamzhongyong");????????if(name.isPresent()){????????????System.out.println(name.get());????????}

?

3、Object中常用的方法

例如我们常见的equals方法和hashCode方法,Objects中都有与之对应的方法提供;

同时,toString是我们比较常用的,Objects.toStringHelper方法十分方便

12345678public?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?类)

12345678public?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的那个性能不咋滴

123456public?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为例子,初始化一个集合,然后向里面放置几个不变的集合

123Map<Integer,String> mapa =?new?HashMap<Integer,String>();????????mapa.put(122,?"iamzhongyong");????????mapa.put(1222,?"bixiao.zy");

现在用Immutable就可以很简单的完成了

12ImmutableMap<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来解决这个问题,简洁明了

12345Multimap<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中可以看到,类似这个

12345CacheBuilder.newBuilder()????????????.maximumSize(10)????????????.initialCapacity(3)????????????.expireAfterWrite(10, TimeUnit.SECONDS)????????????.build();

下面这个例子是callback的形式

123456789101112public?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的

12345678910111213141516171819202122232425public?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、集合 并集、交集、补集的方法

1234567891011? ? 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);

?

这些仅仅是一个开始

热点排行