Создание потока Java 8 из ArrayNode
можно ли создать поток от com.fasterxml.jackson.databind.node.ArrayNode?
Я попробовал:
ArrayNode files = (ArrayNode) json.get("files");
Stream<JsonNode> stream = Stream.of(files);
но он фактически даст поток одного элемента, начального объекта ArrayNode.
Правильный результат должен быть Stream<JsonNode>, Я могу этого добиться?
3 ответов
ArrayNode осуществляет Iterable. Интерфейс Iterable имеет spliterator() метод. Ты можешь!--7-->создайте последовательный поток из Spliterator используя
StreamSupport.stream(spliterator, false)
An ArrayNode класс обеспечивает случайный доступ: вы можете получить size() и элемент по индексу (используя get(index)). Это все, что вам нужно, чтобы создать хороший поток:
Stream<JsonNode> nodes = IntStream.range(0, files.size()).mapToObj(files::get);
обратите внимание, что это решение лучше, чем использование сплитератора по умолчанию (как предложено другими ответчиками), поскольку он может хорошо разбиваться и правильно сообщает размер. Даже если вы не заботитесь о параллельной обработке, некоторые операции, такие как toArray() будет работать более эффективно, как знать размер заранее помогите выделить массив нужного размера.
ArrayNode#elements возвращает итератор над его элементами, которые вы можете использовать для создания потока (используя StreamSupport). StreamSupport требует Spliterator и для создания Spliterator из итератора можно использовать класс Spliterators.
ArrayNode files = (ArrayNode) json.get("files");
Stream<JsonNode> elementStream = StreamSupport.stream(Spliterators
.spliteratorUnknownSize(files.elements(),
Spliterator.ORDERED),false);
Циклоп-потоки есть StreamUtils класс имеет статический метод, который делает это немного чище (я автор).
ArrayNode files = (ArrayNode) json.get("files");
Stream<JsonNode> elementStream = StreamUtils.stream(files.elements());
принимая во внимание ответ @ JB Nizet, что ArrayNode является итерацией с StreamUtils, которые вы можете передать в ArrayNode и получить поток обратно напрямую.
Stream<JsonNode> elementStream = StreamUtils.stream((ArrayNode) json.get("files"));