꾸준히 기록하자
[Java] Optional Class 본문
Optional 클래스는 Java8부터 지원하고 조건문 없이도 Optional에서 제공되는 메서드로 NPE 예외를 처리할 수 있지만 클래스를 사용했어도 null 체크를 하지 않으면 NoSuchElementException가 발생할 수 있습니다.
* NPE : NullPointerException
Optional 클래스는 무분별하게 사용하는 것보다 라이브러리 반환 타입인 경우에만 사용하시는 게 좋을 것 같습니다..
1. isPresent()
- Optional 객체에 저장된 값이 null 인지 아닌지 확인 메서드
If a value is present, returns true, otherwise false.
Returns: true if a value is present, otherwise false
public boolean isPresent() {
return value != null;
}
아래 코드블록은 isPresent() 예제입니다.
Optional<BoardEntity> optionalBoardEntity = boardRepositoryTests.findById(test);
if (optionalBoardEntity.isPresent()) {
BoardEntity boardEntity = optionalBoardEntity.get();
}
Optional 객체 값이 null인데 isPresent() 메서드를 이용하지 않고 get() 메서드를 사용한다면 NoSuchElementException가 발생합니다.
2. empty(), of(), ofNullable()
- Optional 객체를 생성 메서드
- of()는 null 일 경우 NPE 발생하지만 ofNullable() 그대로 반환해 NPE 발생 안 하지 않습니다.
Returns an empty Optional instance. No value is present for this Optional.
Type parameters: <T> – The type of the non-existent value
Returns: an empty Optional
API Note: Though it may be tempting to do so, avoid testing if an object is empty by comparing with == against instances returned by Optional.empty().
There is no guarantee that it is a singleton. Instead, use isPresent().
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
Returns an Optional describing the given non-null value.
Params: value – the value to describe, which must be non-null
Type parameters: <T> – the type of the value
Returns: an Optional with the value present
Throws: NullPointerException – if value is null
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
Returns an Optional describing the given value, if non-null, otherwise returns an empty Optional.
Params: value – the possibly-null value to describe
Type parameters: <T> – the type of the value
Returns: an Optional with a present value if the specified value is non-null, otherwise an empty Optional
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
아래 코드블록은 빈 Optional 객체 생성 예제 코드입니다.
Optional<String> optional = Optional.empty();
// empty 결과: Optional.empty
아래 코드블록은 of(), ofNullable()의 예제코드입니다.
String val1 = "hi";
String val2 = null;
Optional<String> optional = Optional.ofNullable(val);
// val1 결과: Optional[hi]
// val2 결과: Optional.empty
null이 아닌 경우 of(), ofNullable()의 결괏값이 같습니다.
3. orElse(), orElseGet(), orElseThrow()
- null 대신에 대체할 값을 지정하는 메서드
- orElseGet(): 인수로 람다 표현식
If a value is present, returns the value, otherwise returns other.
Params: other – the value to be returned, if no value is present. May be null.
Returns: the value, if present, otherwise other
public T orElse(T other) {
return value != null ? value : other;
}
If a value is present, returns the value, otherwise returns the result produced by the supplying function.
Params: supplier – the supplying function that produces a value to be returned
Returns: the value, if present, otherwise the result produced by the supplying function
Throws: NullPointerException – if no value is present and the supplying function is null
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
If a value is present, returns the value, otherwise throws NoSuchElementException.
Returns: the non-null value described by this Optional
Throws: NoSuchElementException – if no value is present
Since: 10
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
아래 코드블록은 orElse(), orElseGet() 예제 코드입니다.
@Test
void optional_test() {
Optional<String> optional = Optional.empty();
String testOp1 = optional.orElse(getInfo());
String testOp2 = optional.orElseGet(() -> getInfo());
System.out.println(testOp1);
System.out.println(testOp2);
// 실행
// 실행
// bye
// bye
optional = Optional.of("hi");
String testOp3 = optional.orElse(getInfo());
String testOp4 = optional.orElseGet(() -> getInfo());
System.out.println(testOp3);
System.out.println(testOp4);
// 실행
// hi
// hi
}
private String getInfo() {
System.out.println("실행");
return "bye";
}
위 코드블록을 보시면 주의할 점은 Optional객체에 "hi" 값이 있는데 orElse의 getInfo()가 메서드가 호출되어 "실행" 이 찍혔다는 점인데 이유는 orElse(T other)의 매개변수를 getInfo() 메서드를 인수로 했기 때문입니다. 주의해서 사용하시면 될 거 같습니다.
끝.
'IT > Java' 카테고리의 다른 글
[Java] java.util.Arrays copyOf, copyOfRange Method (0) | 2024.05.30 |
---|---|
[Java] compareTo() (0) | 2023.09.12 |
[Java] Remove HTML tags (0) | 2023.04.13 |
[Java] Regular expression (0) | 2023.03.10 |
[Java] Call by Value & Reference (0) | 2023.01.15 |