偶然的机会接触guava,对于我这种小白来说,google的东西当然是高大上的了,所以抱着学(装)习(逼)的心态,在网上向前辈们学习了下。当然,我学guava主要也就几个目的,首先当然是想着能否把guava应用在自己平日的代码里,如果guava的引用能使代码的书写更加简洁优雅,更着提升程序的性能,减少难以预测的错误,当然是极好的。当然,俺们的目的肯定不限于此,当能很好的应用于项目了,忘了说了,guava应该就是一个工具类集合了,里面对很多我们平常用的对象,方法进行了简单的封装,而使得通过调用guava里扩展的方法比调用java原生的方法要更优雅而严谨,从这方面来说这个封装应该不会太简单。鉴于此,guava学习的终极目标应该是通过源码的分析来学习它牛逼的思想了。(写到此,已经一头雾水)
张三跟李四说让他去找王五的媳妇过来,先不管找隔壁老王媳妇的目的是什么,如果隔壁老王搬走了,当然应该是东窗事发,赶夜路走的,那这个时候老王都找不到了,又怎么找他媳妇呢。这要在程序里也好理解,就空指针异常嘛。也没多大的事,但你这样莫名其妙的空指针不是不优雅,你说没办法,老王不在家。好吧,现在给每户人家配个职岗管家,你就去问管家,人在不在管家一概都知道,这样他就不会莫名其妙的吐你一口空指针了。那guava就有这样的管家免费到货。
这个管家是谁呢,对,就是Optional 。
Optional给null分配了个管家,现在你想要个空对象,只要
Optional<Integer> NullableOpt=Optional.fromNullable(null);
下就好了,这样NullableOpt这个对象就管着一个原本空指针的对象了,现在这样NullableOpt.isPresent()调用这个方法返回的是这个对象是否是空的判断,返回boolean,不为空就是true.当然你大概不会存个null进去。一般的你会有一个变量 比如a,然后你
Optional<Integer> aOpt=Optional.fromNullable(a);
这样你就可以这样if(aOpt.isPresent()){}判断是否为空了,如果不为空的话那怎样取得这个管家管理的那个对象的值呢。get对。
possible.get()就像这样,便能取的所管辖的具体值了。这些你可能不会了,这个值都还没存进去呢,当然,之前这个值是应该要存进去的,那也是很方便的。有两种方法存具体值
Optional<Integer> possible=Optional.of(6);直接存值,如果存了null,运行时报空指针
Optional<Integer> NoNullableOpt=Optional.fromNullable(10);另外这是第二种方法,你会发现这个fromNullable既可以存null,也可以存具体对象,so就是这么酷炫。当然如果你的确要取一个空,Optional也有一个专职方法任你调戏
Optional.absent()返回的对象,的isPresent()的方法比如false,也就是管家明确的告诉你老王没了。跑了。。
在悄悄的告诉你两个方法
例如
Optional<Integer> NullableOpt=Optional.fromNullable(null);这个
你可以通过asSet方法
Set<Integer> set=NullableOpt.asSet();得到一个Set,当然这个Set的size()为1
另外,现在你有个这的毛病,你要看看里面那个值是不是你本来的那个值,像这样
Optional<Integer> bOpt=Optional.fromNullable(12);你放了个12,然后你忘了,你说你咋会忘
好,忘了没事,咱死马当活马,bOpt.or(8)这样要是果真是现在的8,就给你返回原本存进去的那个8,这明显不是啊,没关系,死马当活马么,就拿你传进来的这个8充充数,你知我知,就好了。呵呵。。
开始我们要得到这个存在里面的值是不是得先isPresent()判断下,这样是不是不爽,没事,还有一招
bOpen.orNull();高手都是不变应万变的,这样要是存的是null就返回null要是是某个具体对象或值什么的,就原本那个给他了
今天班会,开到这里,散会。滚蛋儿~~
等等,留个小代码~~
package com.test; import java.util.Set; import org.junit.Test; import com.google.common.base.Optional; public class OptionalTest { @Test public void testOptional() throws Exception { Optional<Integer> possible=Optional.of(6); Optional<Integer> absentOpt=Optional.absent(); Optional<Integer> NullableOpt=Optional.fromNullable(null); Optional<Integer> NoNullableOpt=Optional.fromNullable(10); if(possible.isPresent()){ System.out.println("possible isPresent:"+possible.isPresent()); System.out.println("possible value:"+possible.get()); } if(absentOpt.isPresent()){ System.out.println("absentOpt isPresent:"+absentOpt.isPresent()); ; } System.out.println("fromNullableOpt isPresent:"+NullableOpt.isPresent()); ; if(NoNullableOpt.isPresent()){ System.out.println("NoNullableOpt isPresent:"+NoNullableOpt.isPresent()); ; } } @Test public void testMethodReturn() { Optional<Long> value = method(); if(value.isPresent()==true){ System.out.println("获得返回值: " + value.get()); }else{ System.out.println("获得返回值: " + value.or(-12L)); } System.out.println("获得返回值 orNull: " + value.orNull()); Optional<Long> valueNoNull = methodNoNull(); if(valueNoNull.isPresent()==true){ Set<Long> set=valueNoNull.asSet(); System.out.println("获得返回值 set 的 size : " + set.size()); System.out.println("获得返回值: " + valueNoNull.get()); }else{ System.out.println("获得返回值: " + valueNoNull.or(-12L)); } System.out.println("获得返回值 orNull: " + valueNoNull.orNull()); } private Optional<Long> method() { return Optional.fromNullable(null); } private Optional<Long> methodNoNull() { return Optional.fromNullable(15L); } }