准备student类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
String name;
Integer age;
}
主要用来进行Optional方法的测试:
package com.to.optional;
import org.junit.jupiter.api.Test;
import java.util.Optional;
/*
* 本类用来测试java新特新Optional:
* empty(),of(),ofNullAble(),ifPresent(),isPresent(),filter(),map(),flatMap(),orElse(),ofElseThrow(),get()
* 如果包装对象为空filter()*/
public class OptionalTest1 {
/*ifPresent()方法接受一个Consumer对象(消费函数),如果包装对象的值非空,运行Consumer对象的accept()方法。
* 由于ifPresent()方法内部做了null值检查,调用前无需担心NPE(空值针)问题。*/
Student student = new Student("小猫",18);
@Test
void test1(){
printName(student);
}
public void printName(Student student){
Optional.ofNullable(student.age).ifPresent(System.out::println);
}
/*filter()方法接受参数为Predicate对象,用于对Optional对象进行过滤,如果符合Predicate的条件,
返回Optional对象本身,否则返回一个空的Optional对象。*/
@Test
void test2(){
filterAge(student);
}
public void filterAge(Student student){
Optional.ofNullable(student).filter((s)->s.age>10).ifPresent(System.out::println);
}
/*map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,
并包装成新的Optional对象(包装对象的类型可能改变)。*/
@Test
void test3(){
Integer a = getAge(student).get();
System.out.println(a);
}
public Optional<Integer> getAge(Student student){
Optional<Integer> integer = Optional.ofNullable(student).map(Student::getAge);
return integer;
//先用ofNullable()方法构造一个Optional<Student>对象,然后用map()计算学生的年龄,返回Optional<Integer>对象
//如果student为null, 返回map()方法返回一个空的Optinal对象)
}
/*跟map()方法不同的是,入参Function函数的返回值类型为Optional<U>类型,而不是U类型,这样flatMap()能将一个
二维的Optional对象映射成一个一维的对象。*/
/*这样理解,map()和flatMap()唯一的区别就是flatMap()参数的返回值类型必须是Optional类型,但是最终的结果是Optional,
* 好好理解这句话*/
@Test
void test4(){
Integer integer = getAges(student).get();
System.out.println(integer);
}
public Optional<Integer> getAges(Student student){
return Optional.ofNullable(student).flatMap(s->Optional.ofNullable(s.getAge()));
}
/*orElse()方法功能比较简单,即如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值*/
@Test
void test5(){
String name = getName(student);
System.out.println(name);
String s = getName(student).toString();
System.out.println(s);
}
public String getName(Student student){
return Optional.ofNullable(student).map(Student::getName).orElse("张三");
}
/*orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,
用Supplier对象的get()方法的返回值作为默认值*/
@Test
void test6(){
Student student1 = new Student();
String name1 = getName1(student1);
System.out.println(name1);//张三
}
public String getName1(Student student){
return Optional.ofNullable(student).map(Student::getName).orElseGet(()->"张三");
}
/*orElseThrow()方法其实与orElseGet()方法非常相似了,入参都是Supplier对象,只不过orElseThrow()的Supplier对象
必须返回一个Throwable异常,并在orElseThrow()中将异常抛出
orElseThrow()方法适用于包装对象值为空时需要抛出特定异常的场景。*/
@Test
void test7(){
Student student1 = new Student();
getName2(student1);
}
public String getName2(Student student){
return Optional.ofNullable(student).map(Student::getName).orElseThrow(()-> new RuntimeException("出现异常"));
}
/* T get()
如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException*/
@Test
void test8(){
Student student = new Student();
boolean present = Optional.ofNullable(student).isPresent();
System.out.println(present);
}
}