[英]Local storage in a stream Java 8
我想編寫一個流方法,該方法可能需要忽略基於“ lastGoodVersion”的多個並發值,但是我找不到在流內共享值的方法。 以下是我想做的事情。 關於如何完成這樣的事情有什么建議嗎?
[編輯不要這樣做,這不是Java流的工作方式]
我認為僅使用Java 8 Streams是不可能的。 但是,可能要解決的問題可能是使用一個類似於以下內容的幫助器函數:
private static <T> Stream<T> progressiveFilter(Stream<T> stream,
BiPredicate<T, T> predicate) {
List<T> list = stream.collect(Collectors.toList());
List<T> result = new ArrayList<>();
T previousValue = null;
for (T entry : list) {
if (previousValue == null) {
previousValue = entry;
} else {
if (predicate.test(entry, previousValue)) {
result.add(previousValue);
} else {
previousValue = entry;
}
}
}
if(previousValue != null) {
result.add(previousValue);
}
return result.stream();
}
您正在嘗試的呼叫將如下所示:
progressiveFilter(
allVersionsStream().filter(NSTimestamp::isApproved),
(v, lastCanonicalVersion) -> !v.isEffectiveBefore(relativeDate)
&& v.isEffectiveBefore(lastCanonicalVersion));
這很有可能可以進一步優化。 但是,我希望這一原則是明確的。
顯然,您將無法從lambda主體修改局部變量。 您需要某種包含您要修改的內容的包裝器。 數組通常用於此目的
VERSION[] lastCanonicalVersion = {null}
....
if(...lastCanonicalVersion[0]...)
lastCanonicalVersion[0] = v;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.