假设我们有这个流
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j");
Run Code Online (Sandbox Code Playgroud)
我想在地图中保存相邻字符串的对,其中第一个以"错误"开头.
我想到的是这样的
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 "";
});
Run Code Online (Sandbox Code Playgroud)
但出于两个主要原因,我并不完全满意
reduce功能.在Stream API中,每个函数都有其明确,明确的目的:max应该计算最大值,filter应该根据条件进行过滤,reduce应该产生递增累积值等等.在这里我使用reduce因为(据我所知)它是唯一的功能,它可以让你比较几个值,你可以,不知何故,回到类似"当前值"和"下一个值"的概念.
有更简单的方法吗?是否允许您为每次迭代考虑多个值来迭代流?
我正在考虑的是一些机制,给定当前元素,允许您为每次迭代定义要考虑的"元素窗口".
就像是
<R> Stream<R> mapMoreThanOne(
int elementsBeforeCurrent,
int elementsAfterCurrent,
Function<List<? super T>, ? …Run Code Online (Sandbox Code Playgroud)