我有以下JPA方法可获取对象流
@Cacheable("accounts")
Stream<Account> findAccounts(int branchCode, int accountCode);
由于流将在调用该方法后关闭,因此当我第二次调用该方法时出现以下错误。
java.lang.IllegalStateException: stream has already been operated upon or closed
我想做的是;缓存流的内容(即帐户),并从缓存中读取所有后续调用。 实现此目标的最佳方法是什么?
更新:请注意,我知道使用列表,但是必须保留返回类型Stream。
答案 0 :(得分:4)
您不能缓存Stream
。不过,您可以缓存的是任何类型的Collection
(最好是List
)。
为了不违反API合约,您只需提取一个返回List
的私有方法,并用@Cacheable
对其进行注释。然后,原始方法(不带@Cacheable
注释)仅调用可缓存方法并对其调用stream()
,每次调用时从Stream
构造一个新的List
,像这样:
Stream<Account> findAccounts(int branchCode, int accountCode) {
return findAccountList(branchCode, accountCode).stream();
}
@Cacheable("accounts")
private List<Account> findAccountList(int branchCode, int accountCode);
但是,如果非常决定要缓存惰性评估的数据结构(我不建议这样做),则可以使用jOOλ的SeqBuffer
(不过,它是程序包私有的,所以我想您只需要复制代码即可。)
免责声明:我是SeqBuffer
类的作者。