<R> Stream <R>map (Функциякартограф) стрим - PullRequest
0 голосов
/ 13 декабря 2018

Я смотрел на интерфейс потока и нашел этот метод:

 <R> Stream<R> map(Function<? super T, ? extends R> mapper);

Я не могу найти причину, почему "? Расширяет R" вместо R:

 <R> Stream<R> map(Function<? super T, R> mapper);

так какая будет разница, если я сделаю это, как указано выше?не "?"переменная R, которую я передаю?и это продлится. Я не могу найти причину для этого.

Ответы [ 3 ]

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

? extends R означает, что вы можете передать объект, класс которого получен из R, он же подкласс R.

Таким образом, функция карты может выдавать R и R's subclass в результате.Это разумно.

Например, если у нас есть эти классы: Animal, Groose (extends Animal), Egg Function<Egg, Groose> hatching

Вы можете написать этот код:

List<Egg> eggs = getEggs();
List<Animal> myPets = eggs.stream().map(hatching)....

Вы можете видеть, что вашей функции map требуется тип Animal (R), но ваш маппер возвращает тип Groose (то есть ? extends R).Если функция map записывается как <R> Stream<R> map(Function<? super T, R> mapper);, вам нужно добавить еще одно преобразование из Groose в Animal.

. Вы можете обратиться к этому ответу и понять <? extends T>.

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

В Java Generics являются инвариантами, что означает, что даже если S расширяет P, следующий код выдаст ошибку компиляции -

List<S> list1 = neww ArrayList<>();
List<P> list2 = list1 ; // compile error

Но если у вас есть Listthen, вы можете сделать следующее:

List<S> list1 = neww ArrayList<>();
List<? extends P> list2 = list1 ;
0 голосов
/ 13 декабря 2018

Он использует ? extends R, чтобы разрешить объявлять функции, принятые map, как возвращающие подтип R

Например, для данного потока:

Stream<Number> numberStream = Stream.of(1, 2L);

Inследующий вызов map, R равен Number, но функция имеет тип Function<Number, Integer>:

Function<Number, Integer> function = n -> Integer.valueOf(n.intValue());
Stream<Number> numberStream2 = numberStream.map(function); //would have failed

Если бы это не заняло ? extends R, тогда function было быневерный аргумент (Function<Number, Number> потребовалось бы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...