Java8 中的 Optional
关于Optional
该类位于java.util下,属于final类,其实就是一个工具类。
主要是为了预防运行时抛出 NullPointException
使用示例:
package com.xiaocai.cn.optional;
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
Optional<String> optionalS = Optional.of(new String("zhangxiaocai"));
System.out.println(optionalS.get());
//输出: zhangxiaocai
}
}
Optional主要方法API
方法API | 说明 |
---|---|
of(T value) | 把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException |
ofNullable(T value) | 把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象 |
get() | 如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException |
isPresent() | 如果创建的Optional中的值存在,返回true,否则返回false |
ifPresent(Consumerc) | 如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做 |
orElse(T value) | 如果创建的Optional中有值存在,则返回此值,否则返回一个默认值 |
orElseGet(Supplier s) | 如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值 |
orElseThrow(Supplier s) | 如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 |
empty() | 创建一个空的Optional对象 |
orElseThrow | 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常 |
filter(Predicate p) | 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象 |
map(Function f) | 如果创建的Optional中的值存在,对该值执行提供的Function函数调用 |
flagMap(Function f) | 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象 |
普通思维实例演示
package com.xiaocai.cn.optional;
import java.util.Optional;
import static java.lang.System.out;
public class OptionalTest {
public static void main(String[] args) {
Optional<String> optionalS = Optional.of(new String("zhangxiaocai"));
out.println(optionalS.get());
UserModel user = null;
//Optional<UserModel> userOption1 = Optional.of(user);//会抛异常
//out.println(userOption1.get());
Optional<UserModel> userOption2 = Optional.ofNullable(user);//不会抛异常
out.println(userOption2.get()); //调用的时候会抛异常,因此调用需要先判断
user = new UserModel();
user.setId(1);
user.setName("xiaocai");
user.setEmail("small-rose@qq.com");
//即使使用了之前的变量名,依旧是一个新的对象
userOption2 = Optional.of(user);
out.println(userOption2.get());
if(userOption2.isPresent()){
out.println(userOption2.get());
Optional<Integer> uid = Optional.ofNullable(userOption2.get().getId());
if(uid.isPresent()){
out.println("user id is "+uid.get());
}
Optional<String> email = Optional.ofNullable(userOption2.get().getEmail());
if(email.isPresent()){
out.println("you can send mail to "+email.get());
}
//Optional.orElse - 如果值存在,返回它,否则返回提供的默认值
Optional<String> nameopt = Optional.ofNullable(userOption2.get().getEmail());
String name = nameopt.orElse(new String("zhangxiaocai"));
out.println("user name is "+name);
}else{
out.println("user is null ");
}
}
}
函数式编程演示
函数式编程注意方法API中传的参数。
留意带参数的几个API:ifPresent(Consumer<? super T> consumer
、orElseGet(Supplier<? extends T> other)
orElseThrow(Supplier<? extends X> exceptionSupplier)
map(Function<? super T,? extends U> mapper)
flagMap(Function<? super T,Optional<U>> mapper)
package com.xiaocai.cn.optional;
import static java.lang.System.out;
import java.util.Optional;
import java.util.function.Supplier;
public class OptionalFuncTest {
public static void main(String[] args) {
UserModel user1 = null ;
Optional<UserModel> userop1 = Optional.ofNullable(user1);
//如果user1为null,就实例化一个
//orElse 与之前相同 写法1
UserModel defuser1 =userop1.orElse(new UserModel());
out.println(defuser1);
//函数式 orElseGet 写法2
UserModel defuser2 = userop1.orElseGet(()-> new UserModel());
//if(userop1.isPresent()){ defuser2 = userop1.get(); }else{ defuser2 = new UserModel(); }
out.println(defuser2);
UserModel user = new UserModel();
user.setId(1);
user.setName("xiaocai");
user.setEmail("small-rose@qq.com");
Optional<UserModel> userop2 = Optional.ofNullable(user);
//如果 userop 里的对象不为空,则取出名称并打印
//函数式ifPresent 是无返回值的 Consumer消费型接口
userop2.ifPresent(u -> out.println(u.getName()));
// if(userop2.isPresent()){ out.println(userop2.get().getName()); }
//user1如果是空的,就实例化一个,但是名称也是空的,为了测试orElseGet
Optional<String> nameop = Optional.ofNullable(userop1.orElseGet(()-> new UserModel()).getName());
//函数式orElseGet 是有返回值的 Supplier供给型接口
String userName = nameop.orElseGet(() -> new String("zhangxiaocai"));
// if(nameop.isPresent()){ userName = nameop.get(); }else{ userName = "zhangxiaocai"; }
out.println("user name is " +userName);
//如果要求不允许随便实例化怎么办呢?那就可以判断,是否为空,若为空抛出异常即可
userop1.orElseThrow(IllegalArgumentException::new);
// userop2.map( uOptionalFuncTest::sendEmail (u));
}
public static void sendEmail(UserModel u){
out.println(" send email to " + u.getEmail());
}
}