Инкремент счетчика в Stream findfirst Java 8 - PullRequest
0 голосов
/ 30 мая 2019

В ArrayList хранится необработанный текст.Чтобы убрать ненужные строки сверху, мне нужно найти индекс строки, содержащей определенный тег.

Тег - это не полная строка, а только подстрока.Это означает, что я не могу использовать myArrayList.indexOf («маркер начала»)
(indexOf ищет только полные строки)

Я пытался поместить счетчик в поток, считая строки, которые он обрабатывает, пока не найдетмаркер, но он не работает.

Используя цикл for, я могу найти индекс, но это медленно и безобразно (также приводило к некоторым ошибкам памяти).

Потоковая передача ArrayList через фильтр и возвращение потоком строки, содержащей маркер, дает мне полную строку, которую я ищу.Наличие полной строки включает метод ArrayList.indexOf.

В целом это работает сейчас, но я все еще хочу знать, как установить счетчик для потока.

Цикл For (работает, но уродливо):

    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.Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

1 голос
/ 30 мая 2019

Вы можете получить индекс в одной строке, используя 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!");
...