Рубрики
Без рубрики

Криандо эм Транслирует их на Яву

В этом посте представляю, как создать один Stream без необходимости все объекты в руках. С тегами java, java stream, программакао функциональный, брайлизандевс.

Этот пост очень быстро! Я изучил это очень давно, в то время Java 8 была выпущена, но сегодня у меня была идея использовать его.

Мы можем использовать Поток, чтобы абстрагироваться от один типа коллекции, в ленте мы можем инкапсулировать метод захвата плашки и только разоблачить источник данных.

Я реализую функцию, которая потребляет список продуктов API. Поскольку этот список является резидентной, и мне нужно использовать в нескольких местах, я предпочитаю, чтобы создать Поток, таким образом, всю логику прокрутки списка заключена. Если я возвращал список, первая операция, только произойдет, когда весь список был загружен в память. С помощью Stream, я буду иметь небольшие списки в памяти и, когда она закончится, будет пролистав страницы.

Мы абстрактному мой StoreService , правда? Я расскажу ему, как интерфейс (на самом деле он есть, только что с помощью Микропрофиль RestClient ком Кварки ):

@Path("/")
@RegisterRestClient
public interface StoreService { 
    @GET
    @Path("/produtos")
    @Consumes(MediaType.APPLICATION_JSON)
    List listarProdutos(@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 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”