web-dev-qa-db-ja.com

Java 8 mapToInt(mapToInt(e-> e))はどのようにしてパフォーマンスを正確に向上させるのですか?

私は「Java 8 Lambdas」という本を読んでおり、ある時点で著者は「パフォーマンスの利点があるため、可能な限りプリミティブな特殊関数を使用することをお勧めします」と述べています。

彼はここでmapToInt、mapToLongなどを参照しています。

正直言って、どこからパフォーマンスが出るのかわからない。

例を考えてみましょう:

    // Consider this a very very long list, with a lot of elements
    List<Integer> list = Arrays.asList(1, 2, 3, 4);

    //sum it, flavour 1
    int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue();

    //sum it, flavour 2
    int sum2 = list.stream().mapToInt(e -> e).sum();

    System.out.println(sum1 + " " + sum2);

したがって、最初のケースでは、reduceを使用して値を合計するため、BinaryOperator関数は常にint(acc)とInteger(コレクションの現在の要素)を受け取り、Integerのunboxingを実行します。 int(acc + e)

2番目のケースでは、mapToIntを使用します。これは、各Integerのinbox化を解除してintにし、それを合計します。

私の質問は、2番目のアプローチの利点はありますか?また、マップを使用できたときに、intのマップのポイントは何ですか?

それで、ええ、それはすべて砂糖の構文ですか、それともいくつかのパフォーマンス上の利点がありますか?ある場合は、情報を提供してください

よろしく、

20
adragomir

ボクシングのレベルが上がっています

int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue();

縮小関数はBinaryOperator<Integer>-2つのInteger値が渡され、それらのボックス化が解除されて追加され、結果が再度ボックス化されます。 mapToIntバージョンは、リストからInteger要素のボックス化を解除しますonceそして、その時点からのプリミティブint値をIntStream

27
Ian Roberts