Open yejin9858 opened 1 year ago
자바 8 이전
자바 8 이후
Optional를 반환한다.
public static <E extends Compaarable<E>> Optional<E> max(Collection<E> c){ if(c.isEmpty()) return Optional.empty(); else(E e : c){ if(result == null || e.compareTo(result) > 0) result = Objects.requireNonNull(e); return Optional.of(result); }
Optional은 검사 예외와 취지가 비슷하다. 반환 값이 없을 수도 있음을 API 사용자에게 명확히 알려준다.
메서드가 Optional을 반환한다면 클라이언트는 값을 받지 못했을 때 취할 행동을 선택해야함
기본값 설정 orElse
String lastWordInLection = max(words).orElse("단어 없음");
기본값 설정 비용이 부담되는 경우 Supplier를 인수로 받는 orElseGet
DeviceToken deviceToken = deviceTokenRepository.findByUserId(user.getId()).orElseGet(() -> new DeviceToken(user));
예외 던지기 orElseThrow
팩터리를 반환해야만 예외가 실제로 발생하지 않는 한 예외 생성 비용은 들지 않는다.
Toy myToy = max(toys).orElseThrow(TemperTantrumException::new);
값이 null인 경우를 생각하지 않기
Element lastNobleGas = max(Elements.NOBLE_GASES).get();
안전 밸브 역할 isPresent
Optional이 채워져 있으면 true, 그렇지 않으면 false를 반환함
Optional<PressHandle> parentProcess = ph.parent(); System.out.println("부모 PID: " + (parentProcess.isPresent() ? String.valueOf(parentProcess.get().pid()) : "N/A");
하지만 위 코드는 더 짧게 줄일 수 있다.
System.out.println("부모 PID : " + ph.parent().map(h -> String.valueOf(h.pid()).orElse("N/A")); streamOfOptionals .filter(Optional::isPresent) .map(Optional::get);
Optional을 Stream으로 변환해주는 stream()
streamOfOptionals.flatMap(Optional::stream);
컬렉션, 스트림, 배열, 옵셔널 같은 컨테이너 타입은 옵셔널로 감싸면 안된다.
ProcessHandle.Info의 arguments 메서드는 Optional<String[]>을 반환하는데요?
예외니까 따라하지 말자
결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 한다면 Optional를 반환한다.
하지만 엄연히 새로 할당하고 초기화해야하는 객체이기 때문에 성능이 중요한 상황에 맞지 않을 수 있다.
박싱된 기본 타입을 담는 옵셔널은 기본 타입 자체보다 무거울 수 밖에 없다.
Map의 Key, value, 배열의 원소로 사용은 적절하지 않다. 있는건지 없는건지 알 수 없기 때문
옵셔널을 필드로 사용하는 경우
class Book{ private String title; private String publisher; private String author; private String translator; private String painter;
“메소드가 특정 조건에서 값을 반환할 수 없을 때”
자바 8 이전
자바 8 이후
Optional를 반환한다.
null과 예외 대신 Optional을 선택해야 하는 이유
Optional은 검사 예외와 취지가 비슷하다. 반환 값이 없을 수도 있음을 API 사용자에게 명확히 알려준다.
메서드가 Optional을 반환한다면 클라이언트는 값을 받지 못했을 때 취할 행동을 선택해야함
기본값 설정 orElse
기본값 설정 비용이 부담되는 경우 Supplier를 인수로 받는 orElseGet
예외 던지기 orElseThrow
팩터리를 반환해야만 예외가 실제로 발생하지 않는 한 예외 생성 비용은 들지 않는다.
값이 null인 경우를 생각하지 않기
안전 밸브 역할 isPresent
Optional이 채워져 있으면 true, 그렇지 않으면 false를 반환함
하지만 위 코드는 더 짧게 줄일 수 있다.
Optional을 Stream으로 변환해주는 stream()
반환값으로 무조건 Optional을 사용한다고 좋은 것이 아니다.
컬렉션, 스트림, 배열, 옵셔널 같은 컨테이너 타입은 옵셔널로 감싸면 안된다.
ProcessHandle.Info의 arguments 메서드는 Optional<String[]>을 반환하는데요?
예외니까 따라하지 말자
결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 한다면 Optional를 반환한다.
하지만 엄연히 새로 할당하고 초기화해야하는 객체이기 때문에 성능이 중요한 상황에 맞지 않을 수 있다.
박싱된 기본 타입을 담는 옵셔널은 기본 타입 자체보다 무거울 수 밖에 없다.
Map의 Key, value, 배열의 원소로 사용은 적절하지 않다. 있는건지 없는건지 알 수 없기 때문
옵셔널을 필드로 사용하는 경우