这个类实际中不知道各位开发同学,使用的频率怎么样,目前我在工作中使用的频率一般。
不过还是介绍下这个类:
废话不多说,直接上代码:
/**
* 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()
* flapMap(Function mapper):与map类似,要求返回值必须是Optional
*
*/
public class TestOptional {
@Test
public void test8(){
Optional<Student> op = Optional.ofNullable(new Student("Alfred","M","20"));
Optional<String> str = op.flatMap(e->Optional.of(e.getName()));
System.out.println(str);//输出结果:Optional[Alfred]
System.out.println(str.get());//输出结果:Alfred
}
@Test
public void test7(){
Optional<Student> op = Optional.ofNullable(new Student("Alfred","M","20"));
Optional<String> str=op.map(e->e.getName());
System.out.println(str);//输出结果: Optional[Alfred]
System.out.println(str.get());//输出结果: Alfred
}
@Test
public void test6(){
Optional<Student> op = Optional.ofNullable(null);
Student stu = op.orElseGet(()-> new Student());
System.out.println(stu);//输出结果:Student{name='null', sex='null', age='null'}
}
@Test
public void test5(){
Optional<Student> op = Optional.ofNullable(null);
Student stu =op.orElse(new Student("Alfred","M","20"));
System.out.println(stu);//输出结果:Student{name='Alfred', sex='M', age='20'}
}
@Test
public void test4(){
Optional<Student> op = Optional.ofNullable(new Student());
if(op.isPresent()){
//传一个Optional 对象
System.out.println(op.get());//输出结果:Student{name='null', sex='null', age='null'}
}
}
@Test
public void test3(){
Optional<Student> op = Optional.ofNullable(new Student());
System.out.println(op.get());//输出结果:Student{name='null', sex='null', age='null'}
}
@Test
public void test2(){
Optional<Student> op = Optional.empty();
System.out.println(op.get());//输出结果:java.util.NoSuchElementException: No value present 没有值
}
@Test
public void test1(){
Optional<Student> op = Optional.of(new Student());
Student stu = op.get();
System.out.println(stu);//输出结果:Student{name='null', sex='null', age='null'}
}
@Test
public void test1_1(){
Optional<Student> op = Optional.of(null);//通过这种方式可以快速锁定空指针异常
Student stu = op.get();
System.out.println(stu);//输出结果:java.lang.NullPointerException
}
}
实际中,举个男人和车的例子:
先创建两个类,一个男人类,一个车类
public class Car {
private String idCard;
public Car(String idCard) {
this.idCard = idCard;
}
public Car() {
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
@Override
public String toString() {
return "Car{" +
"idCard='" + idCard + '\'' +
'}';
}
}
public class Man {
private Car car;
private String name;
public Man() {
}
public Man(Car car, String name) {
this.car = car;
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Man{" +
"car=" + car +
", name='" + name + '\'' +
'}';
}
}
改进后的新的NewMan类:
public class NewMan {
private Optional<Car> car = Optional.empty();
public NewMan(Optional<Car> car) {
this.car = car;
}
public NewMan() {
}
public Optional<Car> getCar() {
return car;
}
public void setCar(Optional<Car> car) {
this.car = car;
}
@Override
public String toString() {
return "NewMan{" +
"car=" + car +
'}';
}
}
最后的测试结果如下:
@Test
public void test10(){
//需求:获取每个男人的车的拍照
Man man = new Man();
String str = getManIdCard(man);
System.out.println(str);//输出结果:java.lang.NullPointerException
}
@Test
public void test11(){
//需求:获取每个男人的车的拍照
Man man = new Man();
String str = getManIdCard1(man);
System.out.println(str);//输出结果:11路单车
}
@Test
public void test12(){
//需求:获取每个男人的车的拍照
Optional<NewMan> man = Optional.ofNullable(null);
String str = getNewManIdCard(man);
System.out.println(str);//输出结果:11路单车
}
@Test
public void test13(){
//需求:获取每个男人的车的拍照
Optional<NewMan> man = Optional.ofNullable(new NewMan());
String str = getNewManIdCard(man);
System.out.println(str);//输出结果:11路单车
}
public String getManIdCard(Man man){
return man.getCar().getIdCard();
}
public String getManIdCard1(Man man){
if(man != null){
Car car = man.getCar();
if(car != null){
return car.getIdCard();
}
}
return "11路单车";
}
public String getNewManIdCard(Optional<NewMan> man){
return man.orElse(new NewMan())
.getCar()
.orElse(new Car("11路单车"))
.getIdCard();
}