作为Java程序员应该都会有这样的经历: 调用一个方法得到了返回值,此时却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,否则会抛出NullPointerException异常。
Jdk1.8引入。这是一个可以作为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
of方法 : public static Optional of (T value) : 为非Null的值创建一个Optional,如果此时传入Null.则抛出NullPointerException异常。
/* of */
//调用工厂方法创建optional实例
Optional<String> name = Optional.of("ocean");
//如果传入null,则会抛出NullPointerException异常
Optional<String> someNull = Optional.of(null);
ofNullable方法: public static Optional ofNullable(T value): 返回一个Optional指定值的Optional,如果非空,则返回一个空的Optional对象。
/* opNullable */
Optional empty = Optional.ofNullable(null);
isPresent方法: public boolean isPresent(): 如果存在值返回true,否则返回false
/* isPresent */
Optional name = Optional.of("ocean");
if (name.isPresent()){
System.out.println(name.get());//打印值
}
get方法: public T get() : 如果有值则将其返回,否则抛出NoSuchElementExceptipon异常
/* get */
try{
System.out.println(empty.get());
}catch(NoSuchElementException e){
log.error();
}
ifPresent方法:public void ifPresent(consumer
/* ifPresent */
name.ifPresent((value)->System.out.println("The length of the values is :")+value.length());
orElse方法:public T orElseGet(Suppier
/* orElse */
System.out.println(empty.orElse("There is no value present!"));
System.out.println(name.orElse("There is some value!"));
orElseGet方法:public T orElseGet(Supplier
/* orElseGet */
String strA = " abcd ", strB = null;
Optional optional = Optional.ofNullable(strA);
System.out.println(optional.orElseGet(() -> "haha")); //打印结果:abcd
Optional<String> optional = Optional.ofNullable(strB);
System.out.println(optional.orElseGet(() -> "haha")); //打印结果:haha
orElseThrows方法:public T orElseThrow(Supplier
/* orElseThrows */
String strA = " abcd ", strB = null;
Optional<String> optional = Optional.ofNullable(strA);
optional.orElseThrow(IllegalAccessError::new); //如果为null,抛出IllegalAccessError异常
map方法: public Optional map(Function
/* map */
String name = "abcd";
Optional optional = Optional.of(name);
Optional upperName = optional.map((value) -> value.toUpperCase());//转换成大写
System.out.println(upperName.orElse("No value found!")); //打印结果:ABCD
flatMap方法: public Optional flatMap(Function
/* flatMap */
String name = "abcd";
Optional upperName = Optional.of(name).flatMap((value) -> Optional.of(value.toUpperCase()));
System.out.println(upperName.orElse("No value found!")); //打印结果:ABCD
map和flatMap的区别: map是把结果自动封装成Optional,但是flatMap需要我们自己去进行封装。
filter方法: public Optional filter(Predicate
/* filter */
List names = Arrays.asList("ocean", "oceanhaha");
for (String name:names){
Optional optional = Optional.of(name).filter((value) -> value.length() < 7); //过滤字符长度大于7的name
System.out.println(optional.orElse("The name is more than 6 characters"));
} // 打印结果: ocean 备注: 此时的oceanhaha长度大于7被过滤掉了