Можно ли использовать 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
Знает ли кто-нибудь решение?
Ответы
Ответ 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"));