Я получил следующее решение:
.split(body().tokenize("\n", 1_000, false))
.streaming()
.process(exchange -> {
String[] body = exchange.getIn().getBody(String.class).split("\n");
var records = new ArrayList<FooBar>(body.length);
for(String line: body) {
records.add(objectMapper.readValue(line, FooBar.class));
}
exchange.getIn().setBody(records);
})
objectMapper
- com.fasterxml.jackson.databind.ObjectMapper
Например, файл размером 3,5 ГБ был обработан за ~ 1,2 мин.
Вы эффективно получаете список. Просто не копия внутреннего списка, но что-то действует, как будто это, где список, но только представляет внутреннее состояние.
Это - тот же способ, которым это реализовано в Java (и вероятно много других языков/сред также).
Главная причина состоит в том, что для многих вариантов использования, возвращая абсолютно отдельный список является ненужным и расточительным. Это потребовало бы копирования всего содержания (который может или многие не быть много).
Если Вы просто хотите выполнить итерации по ключам, затем создающим новый список, не необходимо. И если Вам действительно нужен он как отдельный список (как копия) затем, можно легко создать тот список из представления.