본문으로 건너뛰기

Optional 주의사항 orElse

orElse 와 orElseGet 을 사용함에 있어서 주의사항

public class OptionalExercise {

public static void main(String[] args) throws Exception {

/////////////////////
// orElse인 경우 //
/////////////////////
// null 이 아님
Optional<String> memberName = Optional.ofNullable("David");

// 시간측정 (시작시간)
long orElseStartTime = System.currentTimeMillis();

// memberName 은 null 이 아니고, David 이다.
// 그럼에도 불구하고 orElse 가 실행된다.
String orElseMemberName = memberName.orElse(defaultMember());

// 시간측정 (종료시간)
long orElseEndTime = System.currentTimeMillis();

System.out.println("시작 시간 :" + orElseStartTime + " ms");
System.out.println("종료 시간 :" + orElseEndTime + " ms");
System.out.println("처리 시간 :" + (orElseEndTime - orElseStartTime) + " ms");
System.out.println("orElse 로 취득한 멤버 이름 : " + orElseMemberName);

////////////////////////
// orElseGet 인 경우 //
////////////////////////

// 시간측정 (시작시간)
long orElseGetStartTime = System.currentTimeMillis();

// memberName 은 null 이 아니고, David 이다.
// null 이 아니므로 orElseGet 이 실행되지 않는다.
String orElseGetMemberName = memberName.orElseGet(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "DefaultName";
});

// 시간측정 (종료시간)
long orElseGetEndTime = System.currentTimeMillis();

System.out.println("시작 시간 :" + orElseGetStartTime + " ms");
System.out.println("종료 시간 :" + orElseGetEndTime + " ms");
System.out.println("처리 시간 :" + (orElseGetEndTime - orElseGetStartTime) + " ms");
System.out.println("orElseGet 으로 취득한 멤버 이름 : " + orElseGetMemberName);

}
static String defaultMember() throws Exception {

Thread.sleep(1000);
return "DefaultName";
}
}

결과

시작 시간 :1663403712781 ms
종료 시간 :1663403713781 ms
처리 시간 :1000 ms
orElse 로 취득한 멤버 이름 : David
시작 시간 :1663403713788 ms
종료 시간 :1663403713788 ms
처리 시간 :0 ms
orElseGet 으로 취득한 멤버 이름 : David

orElse의 경우에는 값이 있어도 실행된다 / orElseGet은 값이 없을때만 실행된다.
만약 orElse로 처리하는 내용이 시간이 걸리는 경우라면,
값이 있음에도 시간 걸리는 처리를 하게 되므로 불필요한 처리시간을 낭비하게 된다. -> 성능저하 발생
꼭 유념하고 orElse사용시에는 주의해야 한다.