以下のコードは、要約すると、2番目のパラメータにあるエンティティの最初のパラメータをフィルタリングすることを意味します。また、第2パラメータで「変更」が指定された場合は、より狭い結果をフィルタリングする必要があります。
これを実行すると、「IllegalStateException:ストリームが既に操作されているか、閉じています」というエラーが表示されます。
同じストリームを再利用できる方法はありますか?
私はサプライヤー>のようなものを実装している人を見てきましたが、このケースではうまくいかないと思います。または、サプライヤをどのように使用することができるかを理解するためには、それに慣れていません。
追加のフィルタリングが必要なときにストリームを再利用する - Java
/**
* Filters through DocumentAuditEntityListing to find existence of the entities
* ActionEnum, ActionContextEnum, LevelEnum, & StatusEnum.
*
* @param audits A list of audits to search
* @param toFind The audit entities to find
* @return If entities found, return DocumentAudit, else null
*/
public DocumentAudit verifyAudit(DocumentAuditEntityListing audits, DocumentAudit toFind) {
//Filter for proper entities
Stream stream = audits.getEntities().stream().filter(doc -> (
doc.getAction().equals(toFind.getAction())) &&
doc.getActionContext().equals(toFind.getActionContext()) &&
doc.getLevel().equals(toFind.getLevel()) &&
doc.getStatus().equals(toFind.getStatus()));
//If changes were specified, filter further.
if (toFind.getChanges() != null){
stream.filter(change -> (toFind.getChanges().contains(change)));
}
return (DocumentAudit) stream.findFirst().orElse(null);
}
ストリームには、端末方式と非終端方式があります。 mapやfilterのような非終端メソッドは遅延メソッドです。つまり、端末メソッドが呼び出されるまで実際に何もしません。これは、@ Kayamanの説明に従ってフィルタを追加するだけでストリームに「追加」する必要があることを意味しますが、ストリームを「再利用」していないのは、 'findFirst( )。orElse(null) ' – Novaterata
良い質問ですが、実際にエラーメッセージから理解するのは簡単ではありません。本質的にあなたのストリームは一度しか消費されません*しかし、それはエラーメッセージが言っているものではありません... https://stackoverflow.com/a/47548077/1059372 – Eugene