リソース管理に本当に関心がある場合は、コールバック イディオムを使用するのが最も安全な方法です。コレクションを公開するのではなく、エンドユーザーがコレクション内のアイテムを処理できるようにする API を公開します。
public interface Callback<T> {
void handle(T item);
}
public class SuperVitalVault {
public void all(Callback<Precious> callback) {
try (...) {
for (Precious i : ...) {
callback.handle(i);
}
}
}
}
早期終了をサポートする場合はCallback.handle(T)
、 a を返すように変更できます。boolean
try (...) {
for (Precious i : ...) {
if (callback.handle(i)) break;
}
}
Function<T, Boolean>
独自のコールバック インターフェイスを定義しない場合は、Guava のorを使用できますが、Predicate<T>
Guava によって確立されたセマンティクスに違反することに注意してください。
Function のインスタンスは一般に、参照透過性 (副作用なし) であり、equals と一貫性があることが期待されます。つまり、a.equals(b) は function.apply(a).equals(function.apply(b) を意味します)。
Predicate のインスタンスは一般に、副作用がなく、equals と一貫性があると予想されます。