Javaの8つのストリーム:なぜがmapToIntをパラメータとして整数::のparseIntを必要としていますか?

dushkin:

私は、次の例次のような何かを理解しようとしています:

    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要素がある前提方法StringSとにその内容を解析は、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>

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=232101&siteId=1
おすすめ