在访问值之前调用“Optional#isPresent()”

Thi*_*ran 6 java optional java-8 java-stream

由于我在访问以下代码片段的声纳问题中的值之前收到呼叫“Optional#isPresent()”,请帮助我解决此问题。

List <Department> deptList =new ArrayList();

List<Student> studList=new ArrayList();

Department dept= studList.stream().min(comparator.comparing(Department::getDepartmentNo)).get();
Run Code Online (Sandbox Code Playgroud)

在访问值之前调用“Optional#isPresent()”

Dam*_*ero 6

为了让您的代码正常工作,请至少使用 Option 中的安全选项之一(ha,此处允许冗余字词)

Department dept= studList.stream().min(comparator.comparing(Department::getDepartmentNo)).orElse(null);
Run Code Online (Sandbox Code Playgroud)

对于空列表的情况,“null”应该是一个值,我不知道上下文,这就是我放null的原因,请不要使用null!,选择正确的值


Dan*_*sky 5

Optional#get()如果 Optional 中没有任何内容,则抛出异常。Sonar 希望您在获取下面代码片段中的值之前检查可选项,但我不会推荐它,因为Optional类的整个想法是防止空指针异常

Optional<Department> deptOpt= studList.stream().min(comparator.comparing(Department::getDepartmentNo));

Department department = null;
if(deptOpt.isPresent())
    department = deptOpt.get();
}
Run Code Online (Sandbox Code Playgroud)

一个更好的做事方式是以下:

Department department = deptOpt.orElse(Department::new);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果 Optional 不包含任何值(为空),则 deptOpt 将返回一个默认的 Department 对象。

无论如何 - 无论您选择哪种方法,都可以解决声纳问题。