流findfirst Java 8中的递增计数器

流findfirst Java 8中的递增计数器,java,java-stream,counter,findfirst,Java,Java Stream,Counter,Findfirst,ArrayList中存储有原始文本。要清除顶部不需要的行,我需要找到包含特定标记的字符串的索引 标记不是一个完整的字符串,只是一个子字符串。这意味着我不能使用myArrayList.indexOf(“开始标记”) (indexOf仅查找完整字符串) 我试图在流上放置一个计数器,对它处理的字符串进行计数,直到找到标记为止,但它不起作用 使用for循环,我可以找到索引,但这既慢又难看(还出现了一些内存错误) 通过过滤器对ArrayList进行流式处理,并让流返回包含标记的字符串,这样就得到了我要查找

ArrayList中存储有原始文本。要清除顶部不需要的行,我需要找到包含特定标记的字符串的索引

标记不是一个完整的字符串,只是一个子字符串。这意味着我不能使用myArrayList.indexOf(“开始标记”)
(indexOf仅查找完整字符串)

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

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

通过过滤器对ArrayList进行流式处理,并让流返回包含标记的字符串,这样就得到了我要查找的完整字符串。 拥有完整字符串将启用ArrayList.indexOf方法

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

For循环(工作正常但丑陋):

查找完整字符串(适当解决):

这不起作用:

    int counter = 0;
    myArrayList.stream().peek(counter++).
    filter(s -> s.contains("marker text")).findFirst();
这不会编译,因为peek()拒绝对整数x进行操作

我还尝试将x强制转换为原子整数并调用getAndIncrement()方法。这也行不通


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

您可以使用
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!");

流实际上不是为这个用例设计的,也不是为任何涉及索引或顺序性的东西设计的。循环有什么不好的地方?这似乎是另一种情况,当一个好的ol循环更简单、更易读时,人们试图强制
Stream
,Java 9:
myArrayList.Stream().takeWhile(s->!s.contains(“标记文本”)).count()
。Java9之前:保持循环。事实上,即使使用Java9或更高版本,您也可以继续使用循环。
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!");