私は、次の例次のような何かを理解しようとしています:
Stream.of("a1", "a2", "a3")
.map(s -> s.substring(1))
.mapToInt(Integer::parseInt)
.max()
. (etc.)
なぜmapToIntは必要ありません
Integer::parseInt
パラメータとして?それはそれのための暗黙のすべきではありませんか?このパラメータの冗長性はありませんか?
ありがとう!
これは、呼び出し側が何を区別することが重要ですStream#mapToInt(ToIntFunction)
し、どのようなToIntFunction
引数がありません。
- 呼び出しが
mapToInt
あるどのような流れは、(すなわちに要素をマッピングするつもりされますint
)。 ToIntFunction
引数はどのようにストリームは、各要素をマッピングするために起こっていますint
。
彼らは、引数なしの含まれている可能性がmapToInt
暗黙的に解析する方法String
秒のint
秒?はい、しかし、のために働くことをどれだけ見てStream#sorted()
-と、その状況はどこにも近く引数なしなどの任意のか曖昧なようであるmapToInt
方法。
引数なしのsorted
方法は、要素が前提Comparable
(することができる唯一のクラスがあるのに対し、任意のJavaクラスは、インターフェイスを実装することができにおける基本、標準化と普及インターフェースですString
)。この方法は、タイプセーフではありませんしながら、したがって、ユースケースを主張することができ、その存在を正当化するための共通十分です。
しかし、引数なしのmapToInt
要素がある前提方法String
Sとにその内容を解析は、int
高度に特異的なユースケースです。なぜ、このような汎用的なAPIの提供など、Aの具体的な動作のでしょうか?これは、合理的な正当性と完全に独断だろう。例えば、なぜそれぞれをマッピングしていないString
のにlength
代わりに?そして、なぜされString
、特別扱いではなく、他のいくつかのタイプ(複数可)していますか?したがってこの方法は、受け入れToIntFunction
説明引数どのように要素をマップするためにint
ケースバイケースです。
それは、そのノートに役立つ可能性がInteger::parseInt
ある方法を参照些細なの省略形です、ラムダ式。どちらも、の実装です機能インタフェース使用するよりもオプションで冗長小さい匿名クラスを。言い換えれば、あなたは新しい作成しているToIntFunction
インスタンスを引数として渡します。
以下のすべてが機能的に等価です。
// method reference
stream.mapToInt(Integer::parseInt)
// lambda expression
stream.mapToInt((String value) -> Integer.parseInt(value)) // explicit parameter types
stream.mapToInt(value -> Integer.parseInt(value)) // implicit parameter types
// anonymous class
stream.mapToInt(new ToIntFunction<>() {
@Override
public int applyAsInt(String value) {
return Integer.parseInt(value);
}
})
どこにstream
ありますStream<String>
。