【问题标题】:Incrementing counter in Stream findfirst Java 8Stream findfirst Java 8中的递增计数器
【发布时间】:2019-05-30 00:20:22
【问题描述】:

ArrayList 中存储了一个原始文本。为了从顶部清除不需要的行,我需要找到包含某个标签的字符串的索引。

标签不是一个完整的字符串,只是一个子字符串。这意味着我不能使用 myArrayList.indexOf("start marker")
(indexOf 只查找完整的字符串)

我试图在流上放置一个计数器,计算它处理的字符串,直到找到标记,但它不起作用。

使用 for 循环我可以找到索引,但这既慢又难看(也给出了一些内存错误)。

通过过滤器对 ArrayList 进行流式传输,并让流返回包含标记的字符串,从而得到我正在寻找的完整字符串。 拥有完整的字符串会启用 ArrayList.indexOf 方法。

总而言之,它现在可以工作了,但我仍然想知道如何在流上设置计数器。

For-loop(有效但丑陋):

    for(String s : myArrayList)
    {
        if(s.contains("marker text"))
        {
            break;
        }
        else counter++;
    }

找到完整的字符串(体面的解决方法):

    String markerText = myArrayList.stream().filter(s -> s.contains("marker text")).
    findFirst().orElse("marker not found");
    int x = myArrayList.indexOf(markerText); 

这不起作用:

    int counter = 0;
    myArrayList.stream().peek(counter++).
    filter(s -> s.contains("marker text")).findFirst();

这不会编译,因为 peek() 拒绝对整数 x 进行操作。

我还尝试将 x 转换为 AtomicInteger 并调用 getAndIncrement() 方法。这也不起作用。

我看到很多类似的主题,但都使用了foreach方法。谁能告诉我我做错了什么?

【问题讨论】:

  • 流真的不是为这个用例设计的,或者任何涉及索引或顺序的东西。循环有什么不好?
  • 这似乎是另一种情况,当一个好的 ol 循环更简单、更具可读性时,人们试图强制使用 Stream
  • Java 9:myArrayList.stream().takeWhile(s -> !s.contains("marker text")).count()。在 Java 9 之前:保持循环。事实上,即使使用 Java 9 或更高版本,您也可能会继续使用循环。

标签: java java-stream counter findfirst


【解决方案1】:

您可以使用IntStream 在一行中获取索引:

OptionalInt index = IntStream.range(0, list.size()).filter(i -> list.get(i).contains("marker text")).findFirst();

然后使用它:

if(index.isPresent())
    System.out.println("I found " + list.get(index.getAsInt()) + "!");
else
    System.out.println("I didn't find any match!");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2017-09-17
    • 2017-06-13
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多