Java8中可选的容器类的心得
java8使得的很多东西使得可读性变强了,通过方法的调用替代了很多if,for循环,使得语意一目了然,而且节省了编码工作。
*解决空指针异常
*优化代码解决臃肿
例子:我们调用一个方法,得到一个返回值,这个返回值可能会作为一个参数去调用另一个方法,这个时候我不能确定这个返回值是否为空,那么我就会如果(){}否则{}判断。
一个可以为空的容器对象,如果值存在则isPresent()方法则返回true,则调用get()方法方法返回该对象。
JDK 提供三个静态方法来构造一个Optional的方法:
of():非空的值创建一个可选的(明确对象不为空时候)。
ofNullable():对象可能为空也可能不为空。
empty():创建一个为空的对象。
实例后对象能调用的方法如下(可选):
*这里主要说明可选的不同点
例:现在有个实例可选<User>用户
- orElse-如果可选实例有值则将其返回,否则返回orElse方法传入的参数。示例:
System.out.println(empty.orElse(
"No value present!"));//输出:No value present!
System.out.println(name.orElse(
"value!"
));//输出:name的值
- isPresent-如果值存在返回true,否则返回false。示例:
if
(name.isPresent()) {//在Optional实例内调用get()返回已存在的
System.out.println(name.get());
//输出Sanaulla}
- ifPresentf-如果可选实例有值则为其调用consumer,否则不做处理(onsumer类包含一个抽象方法。该抽象方法对传入的值进行处理,但没有返回值)// ifPresent方法接受lambda表达式作为参数。
//lambda表达式对Optional的值调用consumer进行处理。
name.ifPresent((value) -> {
System.out.println(
"The length of the value is: "
+ value.length());
//此处不可以有返回值(return )})
-
get()—若Optional有值则将其返回,否则抛出NoSuchElementException。 user.get();----user不为空的时候返回user的值 /若为空则抛出NoSuchElementException
-
filter()—用来检查Optional值是否满足给定条件 Optional<String> scope = name.filter((value) -> value.length() > 3);
System.out.println(scope .orElse("The scope is less than 3"));
-
map()—map方法通过传入的lambda表达式修改Optonal实例默认值,lambda表达式返回值会包装为Optional实例。
flatMap()—flatMap与map(Funtion)非常相似,区别在于lambda表达式的返回值。map方法的lambda表达式返回值可以是任何类型,但是返回值会包装成Optional实例。但是flatMap方法的lambda返回值总是Optional类型
最后一点:Optional是一个集合,只允许有一个或者0个元素,如果要将optional转换成一个List可以这么写:
List<String> optionallist = collect(optional, toList());
参考:http://www.cnblogs.com/andyfengzp/p/7243847.html