Ленивый просмотр java.util.Collection в Vavr

У меня есть существующий api, который использует java.util.Collection при возврате значений. Я хотел бы использовать эти значения в более поздних частях моей программы с Vavr, но я не хочу использовать нетерпеливые методы, такие как List.ofAll (потому что я не хочу дважды проходить эти Collection объекты). Мой вариант использования выглядит примерно так:

List<Product> filter(java.util.Collection products) {
    return List.lazyOf(products).filter(pred1);
}

Является ли это возможным?


person rattaman    schedule 22.06.2018    source источник
comment
Мне этот вопрос непонятен. Что именно вас беспокоит? Что вы имеете в виду под нарушением всей идеи неизменности? Приведите пример.   -  person Nándor Előd Fekete    schedule 22.06.2018
comment
Будет ли этот «список» использован / пройден только один раз? Если да, то вы хотите вернуть Stream<Product>. Ваш поток может включать filter(...). Поток не будет пройден до тех пор, пока вызывающий абонент не использует терминальную операцию в потоке.   -  person AJNeufeld    schedule 22.06.2018
comment
Как я уже сказал, я хочу использовать список Vavr ‹Product› в более поздних частях программы, поэтому простое использование Java Stream api - не совсем то, что мне нужно. Моя цель - избежать накладных расходов на создание (с нетерпением) списка Vavr из Коллекции продуктов. Я считаю, что фильтр создаст новый список в любом случае, поэтому первоначальное копирование списка (с помощью List.ofAll) не нужно (с моей точки зрения, но, возможно, не с точки зрения Vavr).   -  person rattaman    schedule 22.06.2018


Ответы (2)


Поскольку входная коллекция для метода - это java Collection, вы не можете полагаться на неизменяемость, поэтому вам нужно сразу же обработать значения, содержащиеся в коллекции. Вы не можете отложить это на более поздний момент времени, поскольку нет гарантии, что переданная коллекция останется неизменной.

Вы можете минимизировать количество созданных vavr List, выполняя фильтрацию на итерации переданной коллекции, а затем собирая результат в List.

import io.vavr.collection.Iterator;
import io.vavr.collection.List;
...

List<Product> filter(Collection<Product> products) {
    return Iterator.ofAll(products)
        .filter(pred1)
        .collect(List.collector());
}
person Nándor Előd Fekete    schedule 22.06.2018
comment
Это именно то, что я ищу. Я думаю, им следует упомянуть об этом в своей главе о совместимости в своих документах. Спасибо. - person rattaman; 22.06.2018

Есть Ленивый класс в вавр. Возможно, вы захотите его использовать.

Lazy<Option<Integer>> val1 = Lazy.of(() -> 1).filter(i -> false);
person kucing_terbang    schedule 22.06.2018
comment
Использование Lazy здесь просто создаст значение со списком в качестве элемента. Фильтр получит в качестве аргумента весь список, а не его элементы. Lazy.of (() - ›Arrays.asList (a, b, c)). ForEach (e -› System.out.println (e)); - person rattaman; 22.06.2018