Этот пост очень быстро! Я изучил это очень давно, в то время Java 8 была выпущена, но сегодня у меня была идея использовать его.
Мы можем использовать Поток, чтобы абстрагироваться от один типа коллекции, в ленте мы можем инкапсулировать метод захвата плашки и только разоблачить источник данных.
Я реализую функцию, которая потребляет список продуктов API. Поскольку этот список является резидентной, и мне нужно использовать в нескольких местах, я предпочитаю, чтобы создать Поток, таким образом, всю логику прокрутки списка заключена. Если я возвращал список, первая операция, только произойдет, когда весь список был загружен в память. С помощью Stream, я буду иметь небольшие списки в памяти и, когда она закончится, будет пролистав страницы.
Мы абстрактному мой StoreService
, правда? Я расскажу ему, как интерфейс (на самом деле он есть, только что с помощью Микропрофиль RestClient ком Кварки ):
@Path("/") @RegisterRestClient public interface StoreService { @GET @Path("/produtos") @Consumes(MediaType.APPLICATION_JSON) ListlistarProdutos(@QueryParam("limit") int limit, @QueryParam("offset") int offset) }
Настроены и проверены, что работает правильно, пришло время начать строить Stream. Следующий шаг и спросите себя, какой выбрать товары в этой Stream. Для этого рекомендую читать документацию, Spliterator интерфейс , который является сердцем любого Stream. Учитывая характеристики мой Поток, я буду считать, он неизменен, а не null, и фиксированного размера.
Теперь мы можем реализовать класс, который будет вдохнуть жизнь в Поток. Для этого мы должны в принципе реализовать метод, tryAdvance
, он должен потреблять один из элементов списка продуктов и возврата, если есть или не более элементов. Ниже приведена таблица с реквизитами implmentação метода.
tryAdvance | Будет потреблять элементы из стека. Если стек пуст предложит новую страницу, если придет меньше элементов, который необходим, будет установить один флаг, сказав, что только что элементами. |
trySplit | Всегда возвращает значение null, вы не сможете сделать параллельной обработки. |
estimateSize | Размер клетки еще одну страницу, если последний запрос, вернуться меньше элементов, чем страницы, будет только размер клетки. |
characteristics | Будет сообщить, что этот Поток является неизменяемым, фиксированный размер и не нулевой. |
Следует конечной реализации:
public class RemoteSpliterator implements Spliterator{ private static final Logger logger = LoggerFactory.getLogger(RemoteSpliterator .class); private statica final int LIMITE = 10; // tamanho da página private Queue produtos; private boolean temMais; private int offsetAtual; private StoreService storeService; RemoteSpliterator (StoreService storeService) { produtos = new LinkedList<>(); temMais = true; offsetAtual = 0; this.storeService = storeService; } @Override public boolean tryAdvance(Consumer super Produto> action) { if (produtos.isEmpty()) { if (!temMais) { return false; } else { var produtosRemotos= storeService.listarProdutos(token, LIMITE, offsetAtual); temMais = produtosRemotos.size() == LIMITE; offsetAtual += produtosRemotos.size(); logger.info("Produdos lidos do servidor: {}", produtosRemotos); produtos.addAll(produtosRemotos); } } if (produtos.isEmpty()) { return false; } else { action.accept(produtos.poll()); return true; } } @Override public Spliterator trySplit() { return null; } @Override public long estimateSize() { return temMais ? produtos.size() + LIMITE : produtos.size(); } @Override public int characteristics() { return Spliterator.IMMUTABLE | Spliterator.SIZED | Spliterator.NONNULL; } }
Чтобы закончить, нам просто нужно создать Поток, это можно сделать, вызвав метод Потоковая поддержка.поток usando o Spliterator создан в качестве первого параметра и false
в качестве второго параметра, так как он не принимает параллельной обработки.
Потому что я использовал LinkedList?
Потому что доступ не будет, как в массив, но в стеке. Только я добавлю элементы в конце removereis элементы старта. Использовать ArrayList
имеет более высокую стоимость, добавление и удаление, в то время как его преимущество в доступе к элементам, (1)
.
Для создания Потоков, не нужно иметь все данные в руках, это мощный инструмент, который позволяет превратить любую потока данных в API мощным, что позволит ускорить выполнение кода.
Вам не нужно решать все в список, а затем создать Поток.
Оригинал: “https://dev.to/vepo/criando-um-stream-em-java-2ii9”