当isPresent()获取属性时可选<T>,当为null时为null; Java 8中的功能风格

Wes*_*Gun 4 java spring functional-programming optional java-8

当我从DB检索Student实体时,存储库返回一个可空的Optional<Student>.它有一个birthdate领域.

Optional<Student> getStudentById(String id);
Run Code Online (Sandbox Code Playgroud)

那么,我怎么能用功能样式写一个单行来获取它的生日,当它为null时返回null,何时不返回日期?

我现在:

Date birthdate = studentRepository.getStudentById(id).isPresent() ? 
                    studentRepository.getStudentById(id).get().getBirthdate() : null;
Run Code Online (Sandbox Code Playgroud)

但我认为使用isPresent()和三元是丑陋的; 它只是if/else.

而且,这不起作用:

Date birthdate = studentRepository.getStudentById(id).get().getBirthdate().orElse(null); // this does not work because orElse() cannot chain with getBirthdate()
Run Code Online (Sandbox Code Playgroud)

我是Java 8.

我不认为没有任何开销是可能的,但我愿意接受建议.

Ous*_* D. 6

你可以map使用它orElse来返回值(如果存在)或者提供默认值:

studentRepository.getStudentById(id)
                 .map(Student::getBirthdate)
                 .orElse(defaultValue);
Run Code Online (Sandbox Code Playgroud)

在你的情况下,defaultValue将是null.


Had*_*i J 6

试试这个

studentRepository.getStudentById(id)
           .map(Student::getBirthdate).orElse(null);
Run Code Online (Sandbox Code Playgroud)