我想编写一个流方法,该方法可能需要忽略基于“ 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));


这很有可能可以进一步优化。但是,我希望这一原则是明确的。

10-06 06:09