Обобщенные шаблоны метода map () - PullRequest
0 голосов
/ 05 декабря 2018

Это реализация метода 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));
    }
}

Когда я так называю map(), какой тип T и U?Какой тип подстановочного знака (?)?Это очень запутанно.

Optional<String> os1 = Optional.of("Optional String");
Optional<String> os2 = os1.map(s -> s.toUpperCase());

Оператор Javadoc говорит:

@ param <U> - это тип значения, возвращаемого функцией отображения.

Означает ли " функция отображения " map() метод или аргумент map()?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Мне кажется, у вас неправильный src (с Javadoc) проект вашего JDK.Рассмотрим, что говорит Oracle Docs о Optional в Java 8 :

map (отображение функций)

Если присутствует значение,примените к нему предоставленную функцию сопоставления, и, если результат не равен нулю, верните дополнительный, описывающий результат.

0 голосов
/ 05 декабря 2018

Во-первых, просто чтобы ответить на ваш вопрос:

Означает ли "функция отображения" метод map () или аргумент map ()?

This "«Функция отображения» относится к аргументу, предоставленному методу map типа Optional<T>.

Чтобы упростить понимание, просто на мгновение забудьте о подстановочном знаке (?), как мы моглиобойдемся без путаницы и сосредоточимся на типах T и U, упрощенной версии ниже:

public <U> Optional<U> map(Function<T, U> mapper) { ... }
  • Где T представляет любой тип объекта в качестве ввода, а U представляетлюбой тип в качестве вывода.
  • Function<T, U> mapper представляет функцию, принимающую объект типа T и возвращающую значение типа U
  • Optional<U>, является опциональной инкапсуляцией объектавведите U.

Вы можете визуализировать функцию отображения следующим образом:

         _ _ _ _ _ _ _ _ _ 
        |                 |
        |                 |
T ----->|      logic      | -----> U
        |                 |
        |_ _ _ _ _ _ _ _ _|

Итак, с учетом приведенной выше визуализации и вашего примера:

Optional<String> os1 = Optional.of("Optional String");
Optional<String> os2 = os1.map(s -> s.toUpperCase());

Функция, переданная методу map типа Optional (s -> s.toUpperCase()), равна Function<String, String> mapper ie T в приведенной выше визуализации становится String, а U в приведенной выше визуализации становится String, то есть

             _ _ _ _ _ _ _ _ _ 
            |                 |
            |                 |
  String -->|      logic      | ---> String
            |                 |
            |_ _ _ _ _ _ _ _ _|

Итак, когда указанная выше функция вызывается методом mapНеобязательный тип, он будет выполнять некоторую операцию, представленную «логикой» выше в визуализации, в этом конкретном случае логика просто преобразует входную строку в строку в верхнем регистре.

Как только это будет сделано, метод map типа Optional<T> преобразует эту строку в верхнем регистре в необязательный объект, следовательно, он возвращает Optional<String>.

0 голосов
/ 05 декабря 2018

Независимо от того, является ли это Stream или Optional, цель метода map, который принимает Function<? super T, ? extends U>, состоит в том, чтобы сопоставить каждое входное значение T свыход одного или другого типа U.Подстановочный знак используется для расширения диапазона возможностей отображения.

Означает ли " функция отображения " метод map() или аргумент map()?

Функция отображения является реализацией отображения T -> U анонимного класса интерфейса Function, который может быть сокращен с помощью лямбда-выражения или ссылки на метод.

В вашем примере T и U равны String, так как вы отображаете String в его верхний регистр, который снова равен String.Он ведет себя так же, как UnaryOperator<T> особый случай Function<T, T>, который потребляет и возвращает тот же тип.

С другой стороны, если вы отображаете:

os1.map(s -> s.length())
  • T равно String
  • U равно Integer, так как метод String::length дает целое число

Вы можете сократить лямбду с помощью ссылки на метод:

Optional<String> os2 = os1.map(String::toUpperCase);

... или лучше использовать оба Optional с вместе:

Optional<String> os1 = Optional.of("Optional String");
                               .map(String::toUpperCase);
...