320x100
문자열을 BigDecimal 형태로 바꾸는데 Optional을 사용하다가 of, ofNullable, orElse, orElseGet을 알게되었는데
이름도 비슷하고 아무거나 쓰면 되지 않을까 싶다가 좀 찾아보니 분명한 차이가 있었다.
of VS ofNullable
먼저 of와 ofNullable의 차이는 null을 허용할수 있냐 없냐이다.
of를 사용할때 null이 있으면 NullPointerException이 발생한다.
String str = null;
BigDecimal a = new BigDecimal(Optional.of(str).orElse("0") );
System.out.println(a);
of 대신 ofNullable을 써보면
String str = null;
BigDecimal a = new BigDecimal(Optional.ofNullable(str).orElse("0") );
System.out.println(a);
0이 잘 출력되는 것을 볼 수 있다.
orElse VS orElseGet
둘다 null일때 값을 반환한다는 것은 똑같은데,
만약 매개변수로 함수를 사용하면
orElse 는 항상 호출되고,
orElseGet은 null 일 때만 호출된다.
"0"을 리턴하는 함수 getZero가 있다.
public String getZero() {
System.out.println("getZero!!!");
return "0";
}
1. str이 null일 때
String str = null;
BigDecimal a = new BigDecimal(Optional.ofNullable(str).orElse(getZero()) );
System.out.println(a);
String str = null;
BigDecimal a = new BigDecimal(Optional.ofNullable(str).orElseGet(() -> getZero()) );
System.out.println(a);
==> str이 null 일땐 orElse와 orElseGet은 getZero 함수가 둘 다 호출된다.
2. str이 null이 아닐 때
String str = "100";
BigDecimal a = new BigDecimal(Optional.ofNullable(str).orElse(getZero()) );
System.out.println(a);
orElse의 경우에는 getZero 함수가 호출된다.
String str = "100";
BigDecimal a = new BigDecimal(Optional.ofNullable(str).orElseGet(() -> getZero()) );
System.out.println(a);
orElseGet은 getZero 함수가 호출되지 않는것을 볼 수 있다.
결론
.of 는 null을 허용하지 않고
.ofNullable은 null을 허용한다.
.orElse는 항상 불리고,
.orElseGet은 nul일 때만 불린다.
.orElse와 .orElseGet 안에 일반 데이터를 넣으면 문제되진 않겠지만,
DB Update 한다든지 비지니스적인 흐름에 따라 사용하면 될것 같다.
320x100
'Programming Language > JAVA' 카테고리의 다른 글
[JAVA] list에 객체 add시 주의할 점 (0) | 2023.08.03 |
---|---|
[JAVA] java.sql.Date vs java.util.Date (0) | 2023.03.23 |
[JAVA] Stack (0) | 2023.02.16 |
[JAVA] transient 키워드 (0) | 2022.11.05 |