私は果物のこのリストを持っていると言います: -
List<String> f = Arrays.asList("Banana", "Apple", "Grape", "Orange", "Kiwi");
私は、それぞれの果実にシリアル番号を付加し、それを印刷する必要があります。フルーツやシリアル番号の順番は重要ではありません。だから、これは有効な出力は次のようになります -
4. Kiwi
3. Orange
1. Grape
2. Apple
5. Banana
溶液#1
AtomicInteger number = new AtomicInteger(0);
String result = f.parallelStream()
.map(i -> String.format("%d. %s", number.incrementAndGet(), i))
.collect(Collectors.joining("\n"));
溶液#2
String result = IntStream.rangeClosed(1, f.size())
.parallel()
.mapToObj(i -> String.format("%d. %s", i, f.get(i - 1)))
.collect(Collectors.joining("\n"));
質問
なぜ解#1悪い習慣ですか?私はそれを多くの場所で見てきたAtomicInteger
ベースのソリューションは、(のように悪いです、この答え(私が問題に実行しようとする、上記の並列ストリームを使用した理由だと)特別並列ストリーム処理では、)。
- :私はこれらの質問/回答を見
ては、ストリーム操作がステートフルであるべき例?
ストリームで合法的な方法をインデックス用のAtomicIntegerを使用することはありますか?
Javaの8:ラムダの反復をカウントするための好ましい方法?
「予期しない結果が発生する可能性があります」(私は何かを逃していない限り)彼らはただ言及します。どのような?それは、この例では起こることができますか?そうでない場合、あなたは私はそれが起こることができる例を提供することができますか?
「については一切保証はマッパー機能が適用される順番がなされていない、私はそれを受け入れ、また、順序はこの特定の例では問題ではないので、並列処理の性質だだけでなく、」。
AtomicInteger
スレッドセーフであるので、並列処理で問題になることはありません。
誰かがこのような状態ベースのソリューションを使用している間の問題があるでしょうその場合の例を提供することはできますか?
注またに関しては悪い選択で行動パラメーターのプレゼントからあなたを変更可能な状態にアクセスしようとしていること、安全性とパフォーマンス。あなたはその状態への同期アクセスがない場合は、データ競合を持っているので、あなたのコードが壊れている、しかし、あなたはその状態への同期アクセスを行う場合は、競合があなたからの利益のために求めている並列性を損なう持つ危険性があります。最善のアプローチは、完全に操作をストリーミングするステートフル行動パラメーターを避けるためです。再構築への道は避けステートフルへのストリームパイプラインは通常あります。
スレッドの安全性と正確性の観点から、(並列処理の利点として)ソリューション1.パフォーマンスと何もない間違ったとはいえ、苦しむかもしれません。
なぜ解#1悪い習慣ですか?
私はそれが悪い習慣または容認できない何か言わないだろう。それは、単にパフォーマンスのためにお勧めしません。
「予期しない結果が発生する可能性があります」(私は何かを逃していない限り)彼らはただ言及します。どのような?
「予期しない結果が」非常に広範な用語であり、通常、不適切な同期、「何が起こった地獄のか?」を参照 - 行動のように。
それは、この例では起こることができますか?
それはそうではないのです。あなたはおそらく問題に実行するつもりはありません。
そうでない場合、あなたは私はそれが起こることができる例を提供することができますか?
変更AtomicInteger
にint
置き換え、* number.incrementAndGet()
で++number
、あなたは1を持っています。
*箱入りint
(例えばラッパーベース、アレイベース)あなたは、ラムダの中にそれに取り組むことができるように