大家可以自己打开 Optional类看里面的方法,及文档介绍,更详细
目录
基本类
import lombok.Data;
import java.util.Optional;
@Data
public class User {
private String name;
private Integer age;
private Address address;
// public Optional<Address> getAddress() {
// return Optional.ofNullable(address);
// }
public User() {
System.out.println("ddd");
}
}
import lombok.Data;
import java.util.Optional;
@Data
public class Address {
private String cityName;
// public Optional<String> getCityName() {
// return Optional.ofNullable(cityName);
// }
}
1. Optional类方法介绍及简单使用
of
方法:包装一个对象,且对象不能为空;如果是空对象,会跑异常
使用:
private static void test_of() {
User user = new User();
Optional.of(user);
}
ofNullable
方法介绍:包装一个可以为空的对象
使用:此方法单独使用没有意义,需要配合其他方法使用。比如orElse、orElseGet、isPresent
private static void test_ofNullAble() {
User user = null;
Optional.of(user);
}
get
方法介绍: 获取 Optional内的值。
使用:
private static void test_get() {
User user2 = new User();
User user3 = Optional.of(user2).get();
System.out.println(user2==user3); //true
}
isPresent
方法介绍:返回被包装的值是否为空;
使用:
private static void test_isPresent() {
User user1 = null;
User user2 = new User();
//使用of方法会报错,因为user1是null
boolean u1 = Optional.ofNullable(user1).isPresent();
boolean u2 = Optional.ofNullable(user2).isPresent();
//false
System.out.println(u1);
//true
System.out.println(u2);
}
map
方法介绍:值转换,
使用:
private static void test_map() {
User user1 = new User();
User user2 = new User();
user2.setName("zhandan");
// 取到null值,如果再进行别的操作,比如name1.equals("aa");就会报空指针
String name1 = Optional.ofNullable(user1).map(User::getName).get();
// 取到lisi
String name11 = Optional.ofNullable(user1).map(User::getName).orElse("lisi");
// 取到getlisi,orElseGet需要传一个lambda表达式
String name111 = Optional.ofNullable(user1).map(User::getName).orElseGet(()->"getlisi");
// 直接获取user2对象中name的值
String name2 = Optional.ofNullable(user2).map(User::getName).get();
}
flatMap
方法介绍:转化的值必须是不为null;否则报错
private static void test_flatMap() {
User user1 = new User();
user1.setAddress(new Address());
// 先将user1包装进取,进行flatMap方法时,判断user1是否为空,为空返回null;不为空获取address。
// 这就少了if判断
Address address = Optional.ofNullable(user1).flatMap(User::getAddress).get();
}
orElse
介绍:
orElseGet
orElseThrow
介绍:Optional内值为空会抛异常
2. Optional类场景使用
获取user对象中address的cityname的值,
普通写法
private static String getCityname() {
User user = new User();
if(user != null){
Address address = user.getAddress();
if(address!=null){
String cityName = address.getCityName();
return cityName;
}
}
return null;
}
采用 Optional写法:
private static void test_getCityName() {
User user = new User();
String cityName = Optional.of(user).map(User::getAddress).map(Address::getCityName).orElse(null);
// 这个方法,如果user或者address或者cityName有一个为空就报错。
String cityNameError = Optional.of(user).map(User::getAddress).map(Address::getCityName).get();
System.out.println(cityName);
}
新写法就少了很多的if判断,如果值为空想跑异常,就用下边这个,自己判断值为空抛自定义异常就用上边那个。
操作集合
private static void test_ListStream() {
List<User> list = new ArrayList();
User user1 = new User();
user1.setName("11");
User user2 = new User();
user2.setName("22");
User user3 = new User();
user3.setName("33");
list.add(user1);
list.add(user2);
list.add(user3);
// 操作list.stream
List<String> nameList = Optional.ofNullable(list).map(Collection::stream).orElseGet(Stream::empty).map(User::getName).collect(Collectors.toList());
System.out.println(nameList);
}
更多参考: