先上实战
实战案例一
旧写法
public String getCity(User user) throws Exception{
if(user!=null){
if(user.getAddress()!=null){
Address address = user.getAddress();
if(address.getCity()!=null){
return address.getCity();
}
}
}
throw new Excpetion("取值错误");
}
java8
public String getCity(User user) throws Exception{
return Optional.ofNullable(user)
.map(u-> u.getAddress())
.map(a->a.getCity())
.orElseThrow(()->new Exception("取指错误"));
}
实战案例二
旧写法
if(user!=null){
dosomething(user);
}
java8
Optional.ofNullable(user)
.ifPresent(u->{
dosomething(u);
});
实战案例三
旧写法
public User getUser(User user) throws Exception{
if(user!=null){
String name = user.getName();
if("zhangsan".equals(name)){
return user;
}
}else{
user = new User();
user.setName("zhangsan");
return user;
}
}
java8
public User getUser(User user) {
return Optional.ofNullable(user)
.filter(u->"zhangsan".equals(u.getName()))
.orElseGet(()-> {
User user1 = new User();
user1.setName("zhangsan");
return user1;
});
}
Optional方法说明
一:Optional(T value),empty(),of(T value),ofNullable(T value)
通过of(T value)函数所构造出的Optional对象,当Value值为空时,依然会报NullPointerException。
通过of(T value)函数所构造出的Optional对象,当Value值不为空时,能正常构造Optional对象。
empty()的作用就是返回EMPTY对象
ofNullable(T value)不会throw Exception,ofNullable(T value)直接返回一个EMPTY对象
案例
//调用工厂方法创建Optional实例
Optional<String> name = Optional.of("java265.com");
//创建一个空实例
Optional empty = Optional.ofNullable(null);
//创建一个不允许值为空的空实例
Optional noEmpty = Optional.of(null);
二:orElse简介、orElseGet简介、orElseThrow简介
orElse简介
//当值不为null,orElse方法返回Optional实例的值
//当为null,返回传入的消息
//输出java265.com
System.out.println(name.orElse("other value!"));
//输出:最爱java
System.out.println(empty.orElse("最爱java"));
//抛NullPointerException 因为of中不允许传入Null
System.out.println(noEmpty.orElse("异常");.
orElseGet简介
orElseGet与orElse方法类似
1.区别在于得到的默认值
orElse方法将传入的字符串作为默认值
orElseGet方法可以接受Supplier的实现用来生成默认值
public T orElseGet(Supplier<? extends T> other)
参数:继承Supplier接口的other
当值为null的时候返回
返回:
值存在返回值,值不存在返回other
异常:
当不允许值为空的情况(如)下值为空时或other无效抛NullPointerException
2.当user值不为null时,orElse函数依然会执行createUser()方法,而orElseGet函数并不会执行createUser()方法,大家可自行测试
案例
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:java265.com
System.out.println(name.orElseGet(() -> ``"it's value"``));
//输出:No value
System.out.println(empty.orElseGet(() -> ``"No value"``));
//抛出NullPointerException
System.out.println(noEmpty.orElseGet(() -> ``"it's value"``));
orElseThrow简介
当Optional有值时,
则将其返回
否则抛出Supplier接口创建的异常
orElseThrow语法说明:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
throws X extends Throwable
参数:exceptionSupplier 一个抛异常的实例化Supplier
返回:当前值或当值为null抛出异常
异常:当不允许值为空的时候以及exceptionSupplier为空抛NullPointerException;值为空抛Supplier继承的异常
通过上面的对比我们可发现orElse,orElseGet,orElseThrow三者的区别:
orElse:返回内容
orElseGet:返回实现了Supplier的内容
orElseThrow:直接返回异常信息
三:map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional> mapper)
这两个函数,在函数体上没什么区别。唯一区别的就是入参,map函数所接受的入参类型为Function<? super T, ? extends U>,而flapMap的入参类型为Function<? super T, Optional>
如果User结构是下面这样的
public class User {
private String name;
public String getName() {
return name;
}
}
这时候取name的写法如下所示
String city = Optional.ofNullable(user).map(u-> u.getName()).get();
对于flatMap而言:
如果User结构是下面这样的
public class User {
private String name;
public Optional<String> getName() {
return Optional.ofNullable(name);
}
}
这时候取name的写法如下所示
String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();
四:isPresent()和ifPresent(Consumer<? super T> consumer)
isPresent即判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作。
filter(Predicate<? super T> predicate)
filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty
用法如下
Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);
如上所示,如果user的name的长度是小于6的,则返回。如果是大于6的,则返回一个EMPTY对象。