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