반응형
이 포스팅에서 작성하는 내용은 더 자바, Java 8 에서 발췌하였습니다.
https://www.inflearn.com/course/the-java-java8
Optional
- 해당 타입이 있을수도 없을수도 있는 컨테이너
- 리턴값으로만 사용하는 것이 바람직하다.
(메소드 매개변수, Map의 Key, 인스턴스의 필드로 사용 X) - Optional 리턴 시, null을 리턴하는 것은 좋지 않다.
- 기본 타입용 Optional이 있다.
OptionalInt, OptionalLong, OptionalDouble - Collection, Stream, Map, Array는 Optional을 사용하지 말자.
해당 타입은 비어있는 지 확인할 수 있기 때문.
Method Name | Description |
Optional.of() | |
Optional.ofNullable() | |
Optional.empty() | |
isPresent() | Optional 인스턴스 안에 값이 있으면 true 없으면 false 반환 |
isEmpty() | Optional 인스턴스 안에 값이 있으면 false, 없으면 true 반환 (Java 11 이상 지원) |
get() | Optional 인스턴스 안에 있는 값 가져오기 비어있는 경우, NoSuchElementException 발생 |
ifPresent(Consumer) | Optional 인스턴스 안에 값이 있다면, Consumer 진행. |
orElse(T) | Optional 인스턴스 안에 있는 값 가져오기. 만약, optional이 비어있으면 T로 반환 |
orElseGet(Supplier) | orElse()의 인자가 Supplier |
orElseThrow(Supplier) | Optional 인스턴스 안에 있는 값 가져오기. 만약, optional이 비어있으면 예외 발 |
filter(Predicate) | stream의 filter처럼 Optional 인스턴스 내에서도 filter를 사용 가능 return 타입은 Optional |
map(Function) | Optional 안에 있는 값 변환 |
flatMap(Function) | Optional 안에 들어있는 값이 Optional 이라면 그것을 해제해서 반 |
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Example7 {
public static void main(String[] args) {
List<Person> list1 = new ArrayList<>();
Person examplePerson = new Person(1, "Gabriel", true);
examplePerson.setFriend(new Person(4, "Fabiola", false));
list1.add(examplePerson);
list1.add(new Person(2, "Abbey", false));
// filter 로 찾은 결과를 컬렉션이 아닌 객체 하나로 반환하는 경우, Optional로 반환한다.
// why? filter 로 찾은 결과가 있을 수도 없을 수도 있기 때문.
Optional<Person> nameG = list1.stream()
.filter(p -> p.getName().startsWith("G"))
.findFirst();
System.out.println("== nameG 에 값이 있으면 true로 ==");
System.out.println(nameG.isPresent());
System.out.println("== nameG 에 값이 있으면 출력 == ");
// 1. get() 을 이용한 방법. get() 을 이용하려면 안전하게 값이 있는 지 체크하고 get()을 쓰는 게 좋다.
if(nameG.isPresent()) {
Person personNameA = nameG.get();
System.out.println(personNameA);
}
// 2. ifPresent() 를 이용한 방법
nameG.ifPresent(p -> System.out.println(p));
System.out.println("== nameG 에 값이 없으면 p2 출력 == ");
Person p2 = new Person(3, "Daisy", true);
System.out.println(nameG.orElse(p2));
System.out.println("== Optional 값 안에 Optional 인스턴스가 있을 때 ==");
// 1. map 이용
Optional<Optional<Person>> person = nameG.map(p -> p.getFriend());
Optional<Person> person1 = person.map(p -> p.get());
System.out.println(person1);
// 2.flatMap 이용
Optional<Person> person2 = nameG.flatMap(p -> p.getFriend());
System.out.println(person2);
}
}
반응형
'BE > Java' 카테고리의 다른 글
[Java 8] Concurrent Programming (0) | 2023.04.29 |
---|---|
[Java 8] Date / Time (0) | 2023.04.21 |
[Java 8] stream (0) | 2023.04.14 |
[Java 8] Default Method, Java 8의 NEW 기본 메서드 (0) | 2023.04.13 |
[Java 8] 람다 표현식과 메서드 레퍼런스 (0) | 2023.04.12 |