본문 바로가기
Programming/JAVA

Optional Map

by 한 땀; 한 땀; 2020. 12. 12.
class TestMain {
    public static void main(String[] args) {
       Optional<String> os1=Optional.of("Optional String");
       Optional<String> os2=os1.map(String::toUpperCase);
       System.out.println(os2.get());
    }
}

 

map 메소드는 다음과 같이 정의되어 있다.

 

 public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }

 

정의를 통해 T는 제네릭 클래스, U는 제네릭 메소드임을 알 수 있다.

 

 

아래는 map 메소드의 제네릭 매개변수의 변환 시점이다.

map 메소드의 정의 부분을 보면 mapper.apply(value) 에서 value는 Optional 클래스의 멤버 변수 private fianl T value; 로 선언되어 있다. 즉, apply(T t)는 value에 의해서 apply(String t)가 되며 String 인스턴스의 참조 값을 반환하면서 U가 String으로 결정 된다. 그럼 여기서 매개변수로 하한제한을, 반환형으로 상한제한을 둔 이유는 무엇일까?

 

만약 Optional 인스턴스가 각각 Integer, Double로 두 인스턴스가 선언되어 있고 map 메소드의 인자로 전달되는 Function 인스턴스가 특정 기능을 담아 Number 참조형 참조변수로 전달 되었을 때, 상속의 이유와 목적인 "공통적인 규약을 정의"한다는 의미와 같음을 알 수 있으며 extends 선언을 통한 반환형임을 강조하는 의미와 더불어 개발자로 인한 실수를 방지한다.

 

'Programming > JAVA' 카테고리의 다른 글

Effectively final  (0) 2020.12.11
Lambda Expression  (0) 2020.12.10
Nested Class, Inner Class  (0) 2020.12.08

댓글