1. Optional<T>
- T타입 객체의 래퍼클래스 - Optional<T>
public final class Optional<T> {
private final T value; // T타입의 참조변수
}
- Optional<T> 객체를 생성하는 다양한 방법
String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of("abc");
Optional<String> optVal = Optional.of(null); // NullPointerException발생
Optional<String> optVal = Optional.ofNullable(null); // OK
- null대신 빈 Optional<T> 객체를 사용하자
Optional<String> optVal = null; // null로 초기화 바람직하지않음
Optional<String> optVal = Optional.empty(); // 빈 객체로 초기화
- Optional 객체의 값 가져오기 - get(), orElse(), orElseGet(), orElseThrow()
Optional<String> optVal = Optional.of("abc");
String str1 = optVal.get(); // optval에 저장된 값을 반환. null이면 예외발생
String str2 = optVal.orElse(""); // optVal에 저장된 값이 null일 때는 ""를 반환
String str3 = optVal.orElseGet(String::new); // 람다식 사용가능 () -> new String()
String str4 = optVal.orElseThrow(NullPointerException::new) // null이면 예외발생
- isPresent() - Optional 객체의 값이 null이면 false, 아니면 true를 반환
if(Optional.ofNullable(str).isPresent()) { // if(str!=null)
System.out.println(str);
}
// ifPresent(Consumer) - 널이 아닐때만 작업 수행, 널이면 아무 일도 안 함
Optional.ofNullable(str).ifPresent(System.out::println);
Optional<String> opt = Optional.ofNullable(null);
Optional<String> opt2 = Optional.of("AAA");
System.out.println(opt); // Optional.empty
System.out.println(opt2); // Optional[AAA]
opt.ifPresent(System.out::println); // opt가 null이면 실행 안됨
opt2.ifPresent(System.out::println); // AAA
String str = null;
String str2 = "abc";
if (Optional.ofNullable(str).isPresent()) { // str이 null이라 false
System.out.println(str);
}
if (Optional.ofNullable(str2).isPresent()) { // str2는 abc
System.out.println(str2);
}
str = opt.orElse("EMPTY"); // Optional에 저장된 값이 null이면 "EMPTY"반환
System.out.println(str); // EMPTY
str2 = null;
str2 = opt.orElseGet(String::new);
System.out.println(str2);
2. OptionalInt, OptionalLong, OptionalDouble - 성능 상승(Optional<T>보다)
- 기본형 값을 감싸는 래퍼클래스
public final class OptionalInt{
...
private final boolean isParesent; // 값이 저장되어 있으면 true
private final int value; // int타입의 변수
}
Optional클래스 | 값을 반환하는 메서드 |
Optional<T> | T get() |
OptionalInt | int getAsInt() |
OptionalLong | long getAsLong() |
OptionalDouble | double getAsDouble() |
- 빈 Optional객체와의 비교
OptionalInt opt = OptionalInt.of(0); // OptionalInt에 0을 저장
OptionalInt opt2 = OptionalInt.empty(); // OptionalInt에 0을 저장
System.out.println(opt.isPresent()); // true 값이 저장되어 있으면 true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.equals(opt2)); // false 빈값과 0은 다름
3. 예제
Optional<String> optStr = Optional.of("abcde");
Optional<Integer> optInt = optStr.map(String::length);
//optStr.map(s->s.length());
System.out.println("optStr="+optStr.get()); // optStr=abcde
System.out.println("optInt="+optInt.get()); // optInt=5
int result1 = Optional.of("123")
.filter(x->x.length() > 0)
.map(Integer::parseInt).get();
// .map(s->Integer.parseInt(s));
int result2 = Optional.of("")
.filter(x->x.length() > 0) // filter가 false일 경우 Optional.empty() 빈 옵셔널을반환
.map(Integer::parseInt).orElse(-1); // orElse가 Optional이 비었는지 체크 비었으면 기본값 반환
System.out.println("result1="+result1); // result1=123
System.out.println("result2="+result2); // result2=123
Optional.of("456").map(Integer::parseInt)
.ifPresent(x -> System.out.printf("result3=%d%n",x)); // result3=456
OptionalInt optInt1 = OptionalInt.of(0); // 0을 저장
OptionalInt optInt2 = OptionalInt.empty(); // 빈 객체를 생성
System.out.println(optInt1.isPresent()); // true
System.out.println(optInt2.isPresent()); // false
System.out.println(optInt1.getAsInt()); // getAsInt() 값을 반환하는 메서드
// System.out.println(optInt2.getAsInt()); // 빈 문자열을 반환해서 NoSuchElementException발생
System.out.println("potInt1="+optInt1);
System.out.println("potInt2="+optInt2);
System.out.println("optInt1.equals(optInt2)"+optInt1.equals(optInt2));
'Java' 카테고리의 다른 글
148. collect()와 Collectors - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.12 |
---|---|
147. 스트림의 최종연산 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.12 |
145. 스트림의 중간연산(2) - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.11 |
144. 스트림의 중간연산 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |
143. 스트림의 연산 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |