簡體   English   中英

流Java 8中的本地存儲

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM