반응형
자바 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 문을 사용했던 첫번째 예제에 비해 코드량도 조금 줄어들고 가독성도 좋아졌다. 이런식으로 활용하는 것을 권장한다고 한다.
반응형
'Study > java' 카테고리의 다른 글
람다 표현식(Lambda Experessions) 정리 (3) | 2021.02.08 |
---|---|
함수형 인터페이스(Functional Interface) 정리 (0) | 2021.02.08 |
Java Stream(2) - 가공하기 및 결과 만들기 (0) | 2020.07.26 |
Java Stream(1) - 기본 개념 및 생성하기 (0) | 2020.07.22 |
Comparator를 이용한 Array와 List의 정렬 (0) | 2020.07.03 |