본문 바로가기
Study/java

(펌)Java8 Optional 의 ifPresent 활용

by 유경호 2020. 10. 4.
반응형

자바 8에 추가된 Optional이 제공하는 ifPresent를 사용해서 null을 확인하는 if 문을 줄일 수 있다.

1
2
3
4
5
6
7
8
Member member = memberRepository.findById(id);
if (member != null) {
    if (member.isAdmin()) {
        member.addAdminPermissions();
    } else {
        member.addDefaultPermissions();
    }
}
cs

이런 코드가 있다고 가정해보자. memberRepository가 제공하는 findById를 Member 타입을 리턴하는데 이 값을 null일 수도 있기 때문에 if (member != null)과 같은 코드가 존재한다.

 

이 코드에 이제 Optional을 적용한 다음코드를 살펴보자.

1
2
3
4
5
6
7
8
9
Member member = memberRepository.findById(id);
Optional<Member> memberOptional = Optional.ofNullable(member);
if (memberOptional.isPresent()) {
    if (member.isAdmin()) {
        member.addAdminPermissions();
    } else {
        member.addDefaultPermissions();
    }
}
cs

오히려 인스턴스를 Optional로 감싼 다음 isPresent로 boolean 값으로 받아오는 번거로운 과정이 추가됐고 코드는 더 읽기 힘들어졌다.

 

Optional을 적용하고 싶다면 Member를 리턴하는 findById에서부터 시작해야 한다. findById가 Member가 아니라 Optional을 리턴하게 바꾸고 isPresent가 아닌 ifPresent를 사용하면 Consumer 타입의 함수를 제공할 수 있다.

1
2
3
4
5
6
7
8
Optional<Member> memberOptional = memberRepository.findById(id);
memberOptional.ifPresent(member -> {
    if (member.isAdmin()) {
        member.addAdminPermissions();
    } else {
        member.addDefaultPermissions();
    }
});
cs

보다시피, null을 확인하던 if 문 대신에 ifPresent 함수를 호출하면서 그 안에 함수를 제공했다. 값이 존재하는 경우에 그 안에 있는 내용을 실행한다고 읽을 수 있으니 null 을 확인하는 if 문을 사용했던 첫번째 예제에 비해 코드량도 조금 줄어들고 가독성도 좋아졌다. 이런식으로 활용하는 것을 권장한다고 한다.

 

 

 

 

자료 출저: 자바 Optional 의 ifPresent 활용하기- 백기선(WhiteShip) 블로그

반응형