目录
1、Optional(T value), of(T value), ofNullable(T value)
2、orElse(T other),orElseGet(Supplier other)和orElseThrow(Supplier exceptionSupplier)
3、map(Function mapper)和flatMap(Function> mapper)
4、isPresent()和ifPresent(Consumer consumer)
容器类
Optional类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常;
Optional容器类的常用方法:
方法名 | 含义 |
Optional.of(T t) | 创建一个Optional实例 |
Optional.empty() | 创建一个空的Optional实例 |
Optional.ofNullable(T t) | 若t不为null,创建Optional实列,否则创建空实例 |
isPresent() | 判断是否包含值 |
orElse(T t) | 如果调用对象包含值,返回该值,否则返回t |
orElseGet(Supplier s) | 如果调用对象包含值,返回该值,否则返回s获取的值 |
map(Function f) | 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty() |
flatMap(Function mapper) | 与map类似,要求返回值必须是Optional |
使用实例:
List<String> strings = Arrays.asList("add", null, "bbb");
strings.forEach(x-> {
String o = (String) Optional.ofNullable(x).orElseGet(() -> "空");
System.out.println(o);
});
1、Optional(T value), of(T value), ofNullable(T value)
- Optional(T value),即构造函数,它是private权限的,不能由外部调用的
- of(T value)函数可以构造出的Optional对象,当value为null的时候会报错,不为null的时候可以正常创建
- ofNullable(T value) ofNullable(T value)不会throw Exception,ofNullable(T value)直接返回一个EMPTY对象。
2、orElse(T other),orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier)
- **作用:**orElse和orElseGet的用法如下所示,相当于value值为null时,给予一个默认值:
- 区别:这两个函数的区别:当user值不为null时,
orElse、
函数依然会执行createUser()方法,而orElseGet
函数并不会执行createUser()方法 - 至于orElseThrow,就是value值为null时,直接抛一个异常出去,用法如下所示:用于抛出指定异常
@Test
public void test() {
User user = null;
user = Optional.ofNullable(user).orElse(createUser());
user = Optional.ofNullable(user).orElseGet(() -> createUser());
Optional.ofNullable(user).orElseThrow(()->new Exception("用户不存在"));
3、map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional<U>> mapper)
- 这两个函数做的是转换值的操作,把输出的user转换为name输出。
String city = Optional.ofNullable(user).map(u-> u.getName()).get();
//可以配合上面的一起使用
String s = Optional.ofNullable(user).map(u -> u.getName()).orElseGet(() -> "对象为null");
4、isPresent()和ifPresent(Consumer<? super T> consumer)
isPresent
即判断value值是否为空,而ifPresent
就是在value值不为空时,做一些操作。这两个函数的源码如下
User user = new User();
boolean present = Optional.ofNullable(user).isPresent();
Optional.ofNullable(user).ifPresent(u -> {
System.out.println("当前对象不为null");
});
5、filter(Predicate<? super T> predicate)
- filter 方法接受一个
Predicate
来对Optional
中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回Optional.empty
。 - 如下所示,如果user的name的长度是小于6的,则返回。如果是大于6的,则返回一个EMPTY对象
Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);
String s = Optional.ofNullable(user).filter(u -> (u.getAddress() != null)).map(u -> u.getName()).orElseGet(() -> "user");
实例:
例一
在函数方法中
以前写法
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;
});
}