相关疑难解决方法(0)

Java Stream:有没有办法迭代一次取两个元素而不是一个?

假设我们有这个流

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)

但出于两个主要原因,我并不完全满意

  1. 我在"滥用" reduce功能.在Stream API中,每个函数都有其明确,明确的目的:max应该计算最大值,filter应该根据条件进行过滤,reduce应该产生递增累积值等等.
  2. 这样做会阻止我使用Streams强大的机制:如果我想将搜索限制在前两个结果中怎么办?

在这里我使用reduce因为(据我所知)它是唯一的功能,它可以让你比较几个值,你可以,不知何故,回到类似"当前值"和"下一个值"的概念.

有更简单的方法吗?是否允许您为每次迭代考虑多个值来迭代流?

编辑

我正在考虑的是一些机制,给定当前元素,允许您为每次迭代定义要考虑的"元素窗口".

就像是

<R> Stream<R> mapMoreThanOne(
    int elementsBeforeCurrent,
    int elementsAfterCurrent,
    Function<List<? super T>, ? …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

20
推荐指数
3
解决办法
1万
查看次数

标签 统计

java ×1

java-8 ×1

java-stream ×1