流中的本地存储 Java 8

Local storage in a stream Java 8

我想编写一个流方法,它可能需要忽略多个基于 "lastGoodVersion" 的并发值,但我找不到在流中共享值的方法。以下是我想做的事情。关于如何完成这样的事情有什么建议吗?

[编辑不要这样做,这不是 java 流的工作方式]

显然,您无法从 lambda 主体修改局部变量。您需要某种包装器,其中包含您要修改的内容。数组通常用于此目的

VERSION[] lastCanonicalVersion = {null}

....

                            if(...lastCanonicalVersion[0]...)
                                lastCanonicalVersion[0] = v;

我认为仅使用 Java 8 个流是不可能的。然而,您想要做的事情的可能解决方案可以使用辅助函数,它可能看起来像这样:

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));

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