java.util.Optional<T>
라는 새로운 클래스를 제공하여 null 처리를 쉽게 할 수 있도록 도와준다.Optional 클래스는 객체를 Optional이라는 클래스로 감싸주어 null인 객체를 빈 Optional 로 반환하여 NullPointerException에 대해 안전하도록 만들어 준다.
Optioncal 클래스의 메서드
메서드 | 설명 |
---|---|
empty | 빈 Optional 인스턴스 반환 |
filter | 값이 존재하여 프레디케이트와 일치하면 값을 포함하는 Optional 반환, 값이 없거나 프레디케이트와 일치하지 않으면 빈 Optional 반환 |
flatMap | 값이 존재하면 인수로 제공된 함수를 적용한 결과 Optional을 반환하고 값이 없으면 빈 Optional 반환 |
get | 값이 존재하면 Optional이 감싸고 있는 값을 반환, 값이 없으면 NoSuchElementException 발생 |
ifPresent | 값이 존재하면 지정된 Consumer를 실행, 값이 없으면 아무일도 일어나지 않음 |
ifPresentOrElse | 값이 존재하면 지정된 Consumer를 실행, 값이 없으면 아무일도 일어나지 않음 |
isPresent | 값이 존재하면 true를 반환, 값이 없으면 flase를 반환 |
map | 값이 존재하면 제공된 매핑 함수를 적용 |
of | 값이 존재하면 값을 감싸는 Optional를 반환, 값이 null이면 NullPointerException 발생 |
ofNuallalbe | 값이 존재하면 값을 감싸는 Optional를 반환, 갑싱 null이면 빈 Optional 반환 |
or | 값이 존재하면 같은 Optional을 반환, 값이 없으면 Supplier에서 만든 Optional을 반환 |
orElse | 값이 존재하면 값을 반환하고, 값이 없으면 기본 값을 반환 |
orElseGet | 값이 존재하면 값을 반환하고, 값이 없으면 Supplier에서 생성한 값을 반환 |
orElseThrow | 값이 존재하면 값을 반환, 값이 없으면 Supplier에서 생성한 예외 발생 |
stream | 값이 존재하면 존재하는 값을 포함하는 스트림을 반환, 값이 없으면 빈 스트림을 반환 |
orElse, orElseGet 의 차이점
public String getRandomName() {
LOG.info("getRandomName() method - start");
Random random = new Random();
int index = random.nextInt(5);
LOG.info("getRandomName() method - end");
return names.get(index);
}
String name = Optional.of("baeldung")
.orElse(getRandomName());
이 이 경우 name의 값은 "baeldung"가 있어 null이 아니지만, 콘솔에는 아래와 같이 메세지가 출력된다.
getRandomName() method - start
getRandomName() method - end
orElse()는 메소드를 인수로 받지 않고, 바로, 값을 인수로 받는다.
결국, orElse() 메소드 인수를 할당하기 위해 getRandomName() 메소드가 실행된 후 해당 결과 값을 orElse() 메소드 인수로 할당하기 때문에 Optional의 값과 상관 없이 메소드가 실행되게 되는 것이다.
orElseGet()
String name = Optional.of("baeldung")
.orElseGet(() -> getRandomName());
orElseGet()은 getRandomName()
메서드를 호출하지 않았다.
그 이유는 인수로 전달된 Supplier 메소드 경우 Optional의 값이 없을 때만 get()을 통해 실행** 되기 떄문이다.
-> 메서드가 아닌 값을 넘겨야 할 경우에는 orElse()
를 사용하면 된다.
[Java] Optional – orElse() vs orElseGet() 차이점 알고 쓰자. — 일단은 내 이야기