Java Stream:有没有办法一次迭代两个元素而不是一个元素?编辑编辑2
假设我们有这个流
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j");
我想在地图中保存几个相邻的字符串,其中第一个字符串以“err”开头。
我想到的是这样的东西
Map<String, String> map = new HashMap<>();
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.reduce((acc, next) -> {
if (acc.startsWith("err"))
map.put(acc,next);
if (next.startsWith("err"))
return next;
else
return "";
});
但我对它并不完全满意,主要有两个原因。
- 我“滥用”了功能。在Stream API中,每个函数都有其明确,明确定义的目的:应该计算最大值,应该根据条件进行过滤,应该产生增量累积的值等等。
reduce
max
filter
reduce
- 这样做会阻止我使用 Streams 的强大机制:如果我想将搜索限制在前两个结果上,该怎么办?
我在这里使用是因为(据我所知)它是唯一一个可以让你比较几个值的函数,你可以以某种方式回到类似于“当前值”和“下一个值”概念的东西。reduce
有没有更直接的方法?允许您迭代流,同时考虑每次迭代的多个值?
编辑
我正在考虑的是一些机制,给定当前元素,允许您为每次迭代定义一个要考虑的“元素窗口”。
类似的东西
<R> Stream<R> mapMoreThanOne(
int elementsBeforeCurrent,
int elementsAfterCurrent,
Function<List<? super T>, ? extends R> mapper);
而不是
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
这将是对当前API的强大“升级”。
编辑2
我很欣赏人们提出解决方案的努力,但问题不在于算法本身。通过把流,索引,临时变量放在一起来存储以前的值,有不同的方法可以实现我的目标......但是我想知道Stream API中是否有某种方法设计用于在不破坏“流范式”的情况下处理当前元素以外的元素。类似的东西
List<String> list =
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.filterFunctionImWonderingIfExist(/*filters couples of elements*/)
.limit(2)
.collect(Collectors.toList());
鉴于答案,我认为没有“清晰快速”的解决方案,除非使用StreamEx库