我想编写一个流方法,该方法可能需要忽略基于“ 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));
这很有可能可以进一步优化。但是,我希望这一原则是明确的。