Подтвердить что ты не робот

Можно ли использовать Java 8 Stream API для Android API <24?

Я прочитал этот пост здесь. Но все же я не могу запускать код, содержащий функции Java 8 Stream API, такие как следующие: minSdkVersion < 24.

List<Car> newCars = cars.stream()
                        .filter(s -> s.getColor().equals("red"))
                        .collect(Collectors.toList());

Это не выполняется из-за сообщения об ошибке

Для вызова требуется уровень API 24 (текущий минимум равен 15): java.util.Collection # stream

Знает ли кто-нибудь решение?

4b9b3361

Ответ 1

Вы не можете использовать потоки Java8 на уровне API & lt; 24.

Тем не менее, есть некоторые библиотеки, которые поддерживают некоторые функции потока

https://github.com/aNNiMON/Lightweight-Stream-API

https://github.com/konmik/solid

https://sourceforge.net/projects/streamsupport/  (упомянуто @sartorius в комментарии)

[Обновление k3b 2019-05-23]

https://github.com/retrostreams/android-retrostreams  является побочным продуктом потоковой поддержки, который использует возможности Android Studio 3.x D8/desugar для использования интерфейса по умолчанию & статические методы через границы файлов Jar. Есть также ссылки на другие android-retroXXX, т.е. для CompletableFuture.

Ответ 2

С выпуском 8.2 DexGuard можно использовать Java 8 потоки API также на Android устройств <уровня API 24. Для того, чтобы сделать это, нужно включить streamsupport библиотеку и DexGuard переведет все Java 8 потоковых API вызовы предоставленных библиотека. Никакой дополнительной обработки не требуется, и разработчики могут просто кодировать, используя предоставленный API потоков Java 8. Зависимости также транслируются автоматически, поэтому для разработки Android можно использовать библиотеки с функциями Java 8.

Эта функция также будет включена в ProGuard в ближайшем будущем, следите за обновлениями.

Edit: Proguard 6.1.0, для которого уже существует бета-версия, поддерживает обратный поток Java и поток времени API.

Ответ 3

Может быть, немного опоздал на вечеринку, но я только что увидел, что если мы используем java8.util.stream.StreamSupport, то мы можем запустить тот же подход функционального программирования и использовать его до Api 24. Например, взято из web3j -

StreamSupport.stream(transactionReceipt.getLogs())
            .map(log -> extractEventParameters(event, log))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());

Ответ 4

Создайте Інтерфейс.

public interface Pre<T,R> {
            R get(T item);
        }

Создайте метод фильтрации.

public static  <T> List<T> Filter(List<T> list, Pre<T,Boolean> pre) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        {
            return list.stream().filter(p -> pre.get(p)).collect(Collectors.toList());
        }
        else
        {
            List<T> col = new ArrayList<T>();
            for (int i = 0 ; i < list.size() ; i++)
                if (pre.get(list.get(i)))
                    col.add(list.get(i));
            return col;
        }
    }

Использование кода

    public static class model {
            public String Name;
        }
List<model> models = new ArrayList<>();
            ...
            List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));