He leído esta publicación aquí. Pero aún así no puedo ejecutar código que contenga características de API de Java 8 Stream como las siguientes en minSdkVersion <24.
List<Car> newCars = cars.stream()
.filter(s -> s.getColor().equals("red"))
.collect(Collectors.toList());
Esto no se ejecuta debido al mensaje de error
La llamada requiere un nivel de API 24 (el mínimo actual es 15): java.util.Collection # stream
Entonces, ¿alguien conoce una solución?
java
android
java-8
java-stream
ilimitado101
fuente
fuente
Respuestas:
[respuesta original]
No puede utilizar secuencias de Java8 en el nivel de API <24.
Sin embargo, hay algunas bibliotecas que respaldan algunas de las funciones de transmisión.
https://github.com/aNNiMON/Lightweight-Stream-API
https://github.com/konmik/solid
https://sourceforge.net/projects/streamsupport/ (mencionado por @sartorius en el comentario)
[actualización k3b 2019-05-23]
https://github.com/retrostreams/android-retrostreams es un derivado de streamsupport que aprovecha la capacidad de Android Studio 3.x D8 / desugar toolchain para usar la interfaz por defecto y métodos estáticos a través de los límites de los archivos Jar. También hay enlaces a otros android-retroXXX, es decir, para CompletableFuture.
[actualización de aeracode 2020-07-24]
Buenas noticias , ahora podemos usar Java 8 Stream API y más sin requerir un nivel mínimo de API .
fuente
Desde la versión 8.2 de DexGuard , es posible usar la API de flujos de Java 8 también en dispositivos Android <API nivel 24. Para hacerlo, es necesario incluir el soporte de flujo biblioteca y DexGuard se traducirá todos Java 8 flujo de llamadas a la API a la prevista biblioteca. No se necesita manejo adicional, y los desarrolladores pueden simplemente codificar usando la API de flujos de Java 8 proporcionada. Las dependencias también se traducen automáticamente, por lo que es posible utilizar bibliotecas con características de Java 8 también para el desarrollo de Android.
Esta función también se incluirá en ProGuard en un futuro cercano, estad atentos.
Editar: Proguard 6.1.0 para el que ya existe una versión beta es compatible con el backporting de Java 8 stream y time API.
fuente
java8.util.stream.StreamSupport
Puede que llegue un poco tarde a la fiesta, pero acabo de ver que si lo usamos , podemos ejecutar el mismo enfoque de programación funcional y usarlo antes de Api 24. Por ejemplo, tomado de web3j -fuente
Java 8 Stream API
, creo que la respuesta también debería estar en JAVA.¡Sí lo es ! A partir de AGP 4.0.0 podemos usar Stream API y algunas otras API de Java 8+ (por ejemplo
java.time
)Cambios mínimos requeridos en build.gradle de su aplicación :
android { compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' }
fuente
Otra solución que me gusta usar es usar estáticamente las extensiones de Kotlin sobre las colecciones del código Java, si el proyecto admite ambos, por supuesto :
List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));
Lo mismo para
.map
,.reduce
,.first
, etc ...fuente
Cree una interfaz.
public interface Pre<T,R> { R get(T item); }
Cree un método de filtro.
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; } }
Usando código
public static class model { public String Name; } List<model> models = new ArrayList<>(); ... List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));
fuente