Я прочитал этот пост здесь. Но все же я не могу запустить код, содержащий функции 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
Так кто-нибудь знает решение?
java
android
java-8
java-stream
неограниченно101
источник
источник
Ответы:
[оригинальный ответ]
Вы не можете использовать потоки Java8 на уровне API <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 - это дополнительный продукт от streamsupport, который использует возможности Android Studio 3.x D8 / desugar, позволяющие использовать стандартные и статические методы интерфейса через границы файлов Jar. Также есть ссылки на другие android-retroXXX, т.е. на CompletableFuture.
[обновить код aeracode 2020-07-24]
Хорошие новости , теперь мы можем использовать Java 8 Stream API и многое другое, не требуя минимального уровня API .
источник
Начиная с выпуска DexGuard 8.2, можно использовать API потоков Java 8 также на устройствах Android <уровень API 24. Для этого необходимо включить библиотеку поддержки потоков, и DexGuard переведет все вызовы API потоков Java 8 в предоставленные библиотека. Никакой дополнительной обработки не требуется, и разработчики могут просто кодировать, используя предоставленный API потоков Java 8. Зависимости также переводятся автоматически, поэтому библиотеки с функциями Java 8 можно использовать также для разработки под Android.
Эта функция также будет включена в ProGuard в ближайшем будущем, следите за обновлениями.
Изменить: Proguard 6.1.0, для которого уже существует бета-версия, поддерживает обратный перенос потока Java 8 и API времени.
источник
Возможно, мы немного опоздаем на вечеринку, но я только что увидел, что если мы используем,
java8.util.stream.StreamSupport
то мы можем запустить тот же подход функционального программирования и использовать его до Api 24. Например, взято из web3j -источник
Java 8 Stream API
, я думаю, ответ также должен быть на JAVA!Да, это так ! Начиная с AGP 4.0.0 мы можем использовать Stream API и некоторые другие API Java 8+ (например
java.time
)Минимальные необходимые изменения в build.gradle вашего приложения :
android { compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' }
источник
Другое решение, которое мне нравится использовать, - это статическое использование расширений Kotlin поверх коллекций из кода Java, если проект, конечно, поддерживает оба :
List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));
То же самое для
.map
,.reduce
,.first
, ... и т.д.источник
Создайте интерфейс.
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"));
источник