これは可能ですIterable.forEach()
(ただし、では確実ではありませんStream.forEach()
)。解決策は良くありませんが、それは可能です。
警告:ビジネスロジックの制御には使用しないでください。純粋にの実行中に発生する例外的な状況を処理するために使用してくださいforEach()
。リソースへのアクセスが突然停止するなど、処理されたオブジェクトの1つがコントラクトに違反しています(たとえば、コントラクトでは、ストリーム内のすべての要素null
が突然ではなく予期せず1つである必要がありますnull
)など。
のドキュメントによるとIterable.forEach()
:
すべての要素が処理されるか、アクションが例外をスローするIterable
まで、の各要素に対して指定されたアクションを実行します...アクションによってスローされた例外は、呼び出し元にリレーされます。
したがって、すぐに内部ループを中断する例外をスローします。
コードはこのようなものになります- 私はそれが好きだとは言えませんが、うまくいきます。BreakException
拡張する独自のクラスを作成しますRuntimeException
。
try {
someObjects.forEach(obj -> {
// some useful code here
if(some_exceptional_condition_met) {
throw new BreakException();
}
}
}
catch (BreakException e) {
// here you know that your condition has been met at least once
}
ことに注意してくださいtry...catch
ではないラムダ式の周りではなく、周りの全体のforEach()
方法。より見やすくするには、次のコードの書き起こしを参照してください。
Consumer<? super SomeObject> action = obj -> {
// some useful code here
if(some_exceptional_condition_met) {
throw new BreakException();
}
});
try {
someObjects.forEach(action);
}
catch (BreakException e) {
// here you know that your condition has been met at least once
}
for
ステートメントを使用してください。