2016-09-01 6 views
2

私はString []と、このString []を受け取り、Byte []を返すメソッドを持つコードを書いていました。最終的に、私はByteを変換し、String []の文字列としてキーを持つマップと変換の戻り値を取得する必要があります。これは私がJavaで8つのストリームを同一の実装方法である:productReferenceはIntros.boxed()vs forループ|パフォーマンス

IntStream.range(0, productReferences.length) 
      .filter(index -> (null!= productsPrice[index])).boxed() 
      .collect(Collectors.toMap(position -> productReferences[position], 
        position ->callSomeMethod(productsPrice[position]))); 

のString []とproductsPrice []はバイト[]配列です。

ここで問題はIntStream.boxed()メソッドです。内部的には、整数を整数に変換してストリームを返すので、コストのかかる操作と思われます。

他の方法は、シナリオのような種類を処理する最良の方法は何ループ

for(int i=0;i<productReferences.length; i++){ 
    if (productsPrice[index]==null) continue; 
    //other code 
} 

ために使用するJavaのでしょうか? IntStreamを作成する理由を理解していますが、実際にボクシングを避けるためにboxed()メソッドを使用しないでコレクションメソッドにインデックスを持たせることができますか?

+6

時期尚早な最適化は、すべての悪の根源です。余分なパフォーマンスが絶対に必要な場合を除き、理解しやすいものに固執してください。 – Mac70

+0

@ Mac70あなたが言うことに私は全く同意します。 :-)まだ知識キティに加えて常に+1です。 – piyushGoyal

答えて

4

Stream<Integer>にボックス化する代わりにIntStreamにあるcollect操作を使用できます。

IntStream.range(0, productReferences.length) 
     .filter(index -> productsPrice[index] != null) 
     .collect(
      HashMap::new, 
      (m, i) -> m.put(productReferences[i], callSomeMethod(productsPrice[i])), 
      Map::putAll 
     ); 

コレクタの消費者の一部がObjIntConsumerを要するため、これはIntegerにすべてのインデックスをボックスません。上記のコードのiintです。 As Holger notedCollectors.toMapを使用する初期コードは、このバージョンが値を上書きする重複キーの場合に例外をスローします。

実際のデータで2つのソリューションをベンチマークして、改善が得られるかどうかを確認する必要があります。

+2

これが潜在的なパフォーマンスの改善となることが想定されることは、 'IntStream'が存在する理由です。しかし意味論的な違いがあることに注意すべきである。 'toMap'は重複したキーがあれば例外をスローしますが、このバリアントは静かに上書きします。ちなみに、値は 'productsPrice [position]'ではなく、 'callSomeMethod(productsPrice [position])'であると考えられます。 – Holger

+0

うん。それは意味をなさない..サプライヤーアキュムレータとフィニッシャーの古典的なケース..そして、オートボクシング以来、私のアプローチよりも優れたパフォーマンス。両方のおかげで! :-) – piyushGoyal

関連する問題