Во-первых, я хотел бы отметить, что с исходным кодом, который вы хотите изменить, не так много ошибок. Просто потому, что в Java есть потоки, у вас нет для их использования.
Чтобы использовать потоки, я бы разбил решение на две фазы:
OptionalInt indexOfMatchingItem = IntStream.range(0, tracings.size())
.filter(i -> tracings.get(i).getDestination())
.findFirst();
List<ShipmentTracingDTO> newTracings = new ArrayList<>(
indexOfMatchingItem
.map(i -> tracings.subList(0, i + 1))
.orElse(tracings));
Вышеприведенное можно записать в виде одного выражения, но разделение его промежуточной переменной с соответствующим именем может сделать код самодокументированным.
Я создал новый ArrayList, чтобы на него не повлияли никакие последующие изменения в исходном списке tracings
. Если tracings
является неизменным, вы можете пропустить создание нового ArrayList.
Приведенное выше решение несколько лучше, чем исходный код в вопросе, поскольку конструктор ArrayList предварительно выделяет массив точно требуемого размера и, таким образом, позволяет избежать накладных расходов на изменение размера и копирование нескольких массивов.
Альтернативное (возможно, более читаемое, но менее производительное) решение:
List<ShipmentTracingDTO> newTracings =
Stream.concat(
tracings.stream().takeWhile(i -> !tracings.get(i).getDestination()),
tracings.stream().dropWhile(i -> !tracings.get(i).getDestination()).limit(1)
).collect(toList());