Всем доброй ночи. UPDATE: задача наконец-то решена. Действительно, процесс пересоздания стримов ломал все быстродействие. Благодаря Алексею, решение уйти от хранимого списка всех строк логов для дальнейшей работы, по сути оказалось решением самой проблемы, но вернуть стрим просто так мы не можем, поскольку, все стримы одноразовые. То есть после использования стрима нужно создать новый, а значит и сохранить его локально в переменной и дергать его по надобности мы не можем. Благо для этого есть Supplier, который может поставлять нам новый стрим для каждого нового использования, и этот саплайер мы как раз локально и сохраним. Буду очень признателен всем, кто поможет понять, почему программа закрывается по "Time Out" на сервере. Сначала, в LogParser конструкция, которая фильтровала даты по before была такая:
.filter(x -> ((this.getDate(x).getTime()) >= (after != null ? after.getTime() : 0)))
.filter(x -> ((this.getDate(x).getTime()) <= (before != null ? before.getTime() : new Date().getTime())))
но понятно, что это вызывала ошибку валидации, так как в логах содержатся несуществующие даты, больше текущей. Но зато, выполнение программы не оканчивалось "таймаутом", пофиксил ошибку путем вставки метода-заглушки, который вытаскивал максимальную дату из логов и по надобности подсовывал ее, если бОльшая временная граница передавалась как null и после этого программа при валидации стала падать с таймаутом, хотя у меня все отлично тестируется и заканчивается. PS: Приходится удалять файл тестов перед отправкой на валидацию, похоже что валидатор ничего не знает про JUnit5, прикладываю его отдельно. PSS: Только пытаюсь понять философию стримов, так что прошу сильно не бить, если что не так. Буду благодарен за любые комментарии по улучшению текущей структуры. Всех заранее благодарю за помощь.
package com.javarush.task.task39.task3913;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

class LogParserTest {

    private LogParser parser;

    @BeforeEach
    public void unit() {
        Path path = Paths.get("D:\\TestDirectory");
        this.parser = new LogParser(path);
    }

    @Test
    void getNumberOfUniqueIPs() throws ParseException {
        int count = parser.getNumberOfUniqueIPs(null, null);
        Assertions.assertEquals(5, count);

        DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
        Date after = df.parse("30.01.2014 12:56:22");
        count = parser.getNumberOfUniqueIPs(after, null);
        Assertions.assertEquals(5, count);

        Date before = df.parse("14.10.2021 11:38:21");
        count = parser.getNumberOfUniqueIPs(after, before);
        Assertions.assertEquals(3, count);
        count = parser.getNumberOfUniqueIPs(null, before);
        Assertions.assertEquals(3, count);

    }

    @Test
    void getUniqueIPs() {
        HashSet<String> expected = new HashSet<>();
        expected.add("127.0.0.1");
        expected.add("192.168.100.2");
        expected.add("146.34.15.5");
        expected.add("12.12.12.12");
        expected.add("120.120.120.122");
        Set<String> ips = parser.getUniqueIPs(null, null);
        Assertions.assertEquals(expected, ips);
    }

    @Test
    void getIPsForUser() {
        final String user = "Eduard Petrovich Morozko";
        final HashSet<String> expected = new HashSet<>();
        expected.add("146.34.15.5");
        expected.add("127.0.0.1");
        final Set<String> ips = parser.getIPsForUser(user, null, null);
        Assertions.assertEquals(expected, ips);
    }

    @Test
    void getIPsForEvent() {
        HashSet<String> expected = new HashSet<>();
        expected.add("146.34.15.5");
        Set<String> ips = parser.getIPsForEvent(Event.DOWNLOAD_PLUGIN, null, null);
        Assertions.assertEquals(expected, ips);
        ips = parser.getIPsForEvent(Event.WRITE_MESSAGE, null, null);
        expected.clear();
        expected.add("127.0.0.1");
        expected.add("146.34.15.5");
        Assertions.assertEquals(expected, ips);

    }

    @Test
    void getIPsForStatus() {
        final HashSet<String> expected = new HashSet<>();
        expected.add("127.0.0.1");
        expected.add("146.34.15.5");
        final Set<String> ips = parser.getIPsForStatus(Status.FAILED, null, null);
        Assertions.assertEquals(expected, ips);
    }
}