annimon java android java-8 java-stream

annimon - ¿Es posible usar la API Java 8 Stream en la API de Android<24?



android java 8 (4)

Crea una interfaz.

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; } }

Crea un método de filtro.

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

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"));

He leído esta post aquí. Pero aún no puedo ejecutar el código que contiene características de la API Java 8 Stream como la siguiente 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 el nivel 24 de API (el minimo actual es 15): java.util.Collection # stream

Entonces, ¿alguien sabe una solución?


Desde la versión 8.2 de DexGuard , es posible utilizar la API de secuencias de Java 8 también en dispositivos Android <nivel 24 de API. Para hacerlo, es necesario incluir la biblioteca de soporte de secuencias y DexGuard traducirá todas las llamadas de API de secuencias de Java 8 a las proporcionadas biblioteca. No se necesita un manejo adicional, y los desarrolladores pueden simplemente codificar utilizando la API de secuencias 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 característica también se incluirá en ProGuard en un futuro próximo, estad atentos.

Editar: Proguard 6.1.0 para el cual ya existe una versión beta que admite la transmisión de Java 8 y la API de tiempo.


No puede usar secuencias Java8 en el nivel de API <24.

Sin embargo, hay algunas bibliotecas que respaldan parte de la funcionalidad 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 spin-off de streamsupport que aprovecha la capacidad de Android Studio 3.x D8 / desugar toolchain para usar la interfaz predeterminada y los métodos estáticos a través de los límites del archivo Jar. También hay enlaces a otros android-retroXXX, es decir, para CompletableFuture.


Puede que sea un poco tarde para la fiesta, pero acabo de ver que si usamos java8.util.stream.StreamSupport , podemos ejecutar el mismo enfoque de programación funcional y usarlo antes de Api 24. Ej. Tomado de web3j -

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