핵심정리 1: Optional<T>

핵심 정리 2: Optional<T>

isPresent() 대신 map(), filter(), flatMap(), ifPresent() 사용하기.

컬렉션, 스트림, 배열, 옵셔널 같은 컨테이너 타입은 옵셔널로 감싸면 안 된다.

박싱(boxing)된 기본 타입을 담은 옵셔널을 반환하지 않는다.

옵셔널을 컬렉션의 키, 값, 원소나 배열의 원소로 사용하는 게 적절한 상환은 거의 없다.

옵셔널은 결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 한다 면 Optional<T>를 반환한다.

// 불필요하게 사용한 Optional의 isPresent 메서드를 제거하자. (329쪽)
public class ParentPid {
    public static void main(String[] args) {
        ProcessHandle ph = ProcessHandle.current();

        // isPresent를 적절치 못하게 사용했다.
        Optional<ProcessHandle> parentProcess = ph.parent();
        ~~System.out.println("부모 PID: " + (parentProcess.isPresent() ?
                String.valueOf(parentProcess.get().pid()) : "N/A"));~~

        // 같은 기능을 Optional의 map를 이용해 개선한 코드
        **System.out.println("부모 PID: " +
            ph.parent().map(h -> String.valueOf(h.pid())).orElse("N/A"));**

        // p329 Optional의 스트림 - anti pattern 
        ~~Stream<Optional<String>> streamOfOptionals = Stream.of(~~
                Optional.of("Apple"),
                Optional.empty(),
                Optional.of("Banana"),
                Optional.of("Cherry"),
                Optional.empty()
        );

        **// isPresent를 적절치 못하게 사용했다.**
        streamOfOptionals.filter(Optional::isPresent)
                .map(Optional::get)
                .forEach(System.out::println);

        **// 같은 기능을 Optional의 스트림을 이용해 개선한 코드
        streamOfOptionals.flatMap(Optional::stream)
                .forEach(System.out::println);**
    }
}