文章目录
1、基本用法
//传入null,会出现NullPointerException,没啥用;
Optional.of(null);
//下面的两个,都会给我们返回一个空的option.empty对象
Optional<Object> o = Optional.ofNullable(null);
Optional<Object> empty = Optional.empty();
System.out.println(o);
System.out.println(empty);
总结: 我们使用Optional就是为了防止空指针,而Optional.of 我们传入null还会返回给我们空指针异常,没啥用;
我们重点关注ofNullable
2、错误用法
2.1、不使用Option的写法
Student student = null;
if (student != null) {
String name = student.getName();
System.out.println(name);
}
2.2、错误使用Optional的写法
这写的感觉还没if 写起来方便呢!
Student student = null;
Optional<Student> optionalStudent = Optional.ofNullable(student);
if (optionalStudent.isPresent()) {
Student student1 = optionalStudent.get();
System.out.println(student1.getName());
}
2.3、正确使用Optional的方法
//step1: new Function<Student, String>; 这里的String指的是,你要取的什么值;
optionalStudent.map(new Function<Student, String>() {
//step2:取出你要的值
@Override
public String apply(Student student) {
return student.getName();
}
}).ifPresent(new Consumer<String>() {
//step2: 你要的值不为空,执行的操作
@Override
public void accept(String s) {
System.out.println(s);
}
});
上面的代码,经过idea简化,可以得到下面的形式
optionalStudent.map(Student::getName).ifPresent(System.out::println);
3、Optional高级使用方式
3.1、如果存在干点啥
optionalStudent.ifPresent(student12 -> {
int age = student.getAge();
student.setCore(age);
});
3.2、orElse和orElseGet的区别
public static void main(String[] args) {
//实际使用案例
//一般方法
Student student = new Student(张三,23,1);
Optional<Student> student1 = Optional.ofNullable(student);
student1.orElse(createStudent());
System.out.println(执行过了orElse);
student1.orElseGet(Test::createStudent);
}
public static Student createStudent() {
System.out.println(创建了student);
return new Student();
}
输出结果
创建了student
执行过了orElse
可以看到如果orElseGet,如果对象不为空,则不进行了对象的创建的;
3.3、过滤
Optional<Student> student1 = Optional.ofNullable(new Student(张三,23,1));
student1.filter(student22 -> student22.getAge()>20).ifPresent(student2 -> System.out.println(student2.getAge()));
3.4、map和flatmap的区别
Student student = new Student(张三, 23, 1);
Optional<Student> student1 = Optional.ofNullable(student);
Optional<String> flatMapResult = student1.flatMap(student2 -> Optional.ofNullable(student2).map(Student::getName));
Optional<Optional<String>> mapResult = student1.map((student2 -> Optional.ofNullable(student2).map(Student::getName)));
- 两者之间的返回值不一样;
public static void main(String[] args) {
Student student = new Student(张三, 17, 56);
Student student1 = new Student(李四, 18, 56);
Student student2 = new Student(王五, 18, 80);
Student student3 = new Student(小龙, 15, 99);
Student student4 = new Student(小红, 54, 100);
Student student5 = new Student(二哈, 64, 56);
Student student6 = new Student(小白, 84, 84);
List<Student> students = Arrays.asList(student, student1, student2, student3, student4, student5, student6);
testBeforeJava8(students);
testAfterJava8(students);
}
public static void testBeforeJava8(List<Student> studentList) {
for (Student student : studentList) {
if (student != null) {
if (student.getAge() >= 18) {
Integer core = student.getCore();
if (core != null && core >= 80) {
System.out.println(通过java7 及格的人是: + student.getName());
}
}
}
}
}
public static void testAfterJava8(List<Student> studentList) {
for (Student student : studentList) {
Optional<Student> optional = Optional.ofNullable(student);
optional.filter(s -> s.getAge() >= 18).
filter(s -> s.getCore() >= 80).
map(student1 -> student.getName()).
ifPresent(s -> System.out.println(通过java8 及格的人是 + s));
}
}
输出结果
通过java7 及格的人是:王五
通过java7 及格的人是:小红
通过java7 及格的人是:小白
通过java8 及格的人是王五
通过java8 及格的人是小红
通过java8 及格的人是小白