なぜJavaのStream.mapは<関数を取るのでしょうか?スーパーP_OUT、?代わりに、機能<P_OUTの入力としてR>マッパーを拡張?R>は拡張しますか?

Manikandan KBK DIP:

なぜmapAとしてその入力を取るFunctionタイプの<? super P_OUT, ? extends R>代わりに<P_OUT, ? extends R>

私は、たとえば行うと、

List<Integer> list = new ArrayList<>();
list.stream().map(xyz -> {}); // Here xyz is always of type Integer for this instance. 
                              // Then why does it take input as "? super Integer"?

それがあるため、メソッドの参照を制限しないのですか?ことは、唯一のユースケースですか?

オレクサンドルPyrohov:

ワイルドカードは、<? super T>あなたがタイプのより広範なセットで作業することができます。

あなたには、いくつか持っていると仮定し、一般的な機能を:

Function<Number, String> func = String::valueOf;

そして、次の操作を行うことができます:

List<Integer> list = List.of(1, 2);
Stream<String> stream = list.stream().map(func);

または以下:

List<Long> list = List.of(1L, 2L);
Stream<String> stream = list.stream().map(func);

パラメータがあるため、これが可能であるStream.map(...)です:

Function<? super T, ? extends R> mapper;

これは例えば、場合ことを意味T型であるLong1、その後、<? super Long>関数は型の要素を受け入れることができますLongし、次のアサインも有効になります。

Function<? super Long, ? extends String> mapper = func;

ではFunction<T, ? extends R>上記のどちらの例も、コンパイルされないでしょう。


1 -私たちは、構築Stream<Long>の要素からList<Long>

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188482&siteId=1