String isNull;
String name;
isNull = "loose";
name = Optional.ofNullable(isNull).orElse("test");
System.out.println(name); //isNull값이 null이 아니므로 "loose" 출력
isNull = null;
name = Optional.ofNullable(isNull).orElse("test");
System.out.println(name); //isNull값이 null이므로 "test" 출력
→ Optional에 올 값이 null인 경우 orElse 안에 있는 내용을 실행 시킨다.
→ orElse를 사용할 때는 Optional의 대상이 되는 값과 orElse 내의 매개변수 리턴 값은 같아야 한다.
만약 같지 않다면 orElse가 아닌 if문을 이용해서 처리해야 한다.
→ 위 코드에서 orElse()의 리턴 값이 String이므로 변수의 타입 또한 String이다.
private String getName(){
return "loose";
}
String name1 = Optional.ofNullable("loose").orElseGet(() -> "loose");
String name2 = Optional.ofNullable("loose").orElseGet(() -> getName());
System.out.println("name1 = " + name1);
System.out.println("name2 = " + name2);
//출력 결과
//name1 = loose
//name2 = loose
→ orElseGet()은 람다식을 매개변수로 받는다
즉 간단하게 정리를 하면 아래와 같다.
→ orElse는 매개변수가 고정 값일 때 사용하고 orElseGet은 매개변수가 메소드일 때 사용하는 것이 좋다.
만약 orElse의 매개변수에 메서드를 넘기면 어떻게 될까?
→ Optional 인자가 null이 아니어도 그냥 실행되어 버린다.
→ 그렇기에 null일 경우 호출되면 안될 메서드가 호출되는 위험성이 존재한다.
orElseGet()이 고정된 값일 때도 사용함으로 그냥 편하게 orElseGet()을 사용하자.
User user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("user doesn't exist");
→ null인 경우에 예외를 반환한다.