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

Member member = memberRepository.findById(id);
if (member != null) {
    if (member.isAdmin()) {
        member.addAdminPermissions();
    } else {
        member.addDefaultPermissions();
    }
}

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

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

Member member = memberRepository.findById(id);
Optional<Member> memberOptional = Optional.ofNullable(member);
if (memberOptional.isPresent()) {
    if (member.isAdmin()) {
        member.addAdminPermissions();
    } else {
        member.addDefaultPermissions();
    }
}

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

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

Optional<Member> memberOptional = memberRepository.findById(id);
memberOptional.ifPresent(member -> {
    if (member.isAdmin()) {
        member.addAdminPermissions();
    } else {
        member.addDefaultPermissions();
    }
});

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

더 자바, Java 8 - 인프런
자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이 강의를 통해 쉽고 빠르게 자신의 기술로 만드세요.