tutorial operador interfaces funciones funcionales expresiones español ejemplo anonimas java android lambda functional-interface retrolambda

operador - ¿Hay alguna manera de usar las interfaces funcionales de Java 8 en la API de Android por debajo de 24?



java 8 operador:: (4)

Como alternativa, Lightweight-Stream-API también proporciona soporte de backport. Al igual que android-retrostreams mencionado anteriormente, debe reemplazar algunos nombres de paquetes usando:

com.annimon.stream.function lugar de java.util.function

com.annimon.stream.ComparatorCompat lugar de java.util.Comparator

Puedo usar retrolambda para habilitar lambdas con un nivel de API de Android <24. Asi que esto funciona

myButton.setOnClickListener(view -> Timber.d("Lambdas work!"));

Esto tambien funciona

Runnable runLater = () -> Timber.d("Lambdas work!"); runLater.run();

Pero este no lo hace.

Consumer<Integer> runLaterWithInt = (Integer i) -> Timber.d("i = " + i); runLaterWithInt.accept(3);

El último funciona en el nivel 24 de la API de Android, pero en otros dispositivos, este código provoca un bloqueo

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$$Lambda$1

En lugar de usar retrolambda, intenté habilitar Java 8. Los primeros dos ejemplos de código aún funcionan, aunque Butterknife dejó de funcionar. https://developer.android.com/preview/j8-jack.html#configuration aquí ava.util.function se dice que es compatible, pero todavía tengo un fallo al ejecutar el tercero, esta vez es un poco diferente

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1


La biblioteca de soporte de Android (AndroidX) ahora tiene Consumer y Supplier :

Lamentablemente solo estas dos interfaces se agregan a partir de la escritura.

Ahora que tenemos Kotlin, no es necesario que especifique explícitamente la interfaz funcional:

fun test() { val text = withPrintStream { it.println("Header bla bla ") it.printf("%s, %s, %s,", "a", "b", "c").println() } } // Equivalent to the following code in Java: // Consumer<PrintStream> action; // action.accept(ps); fun withPrintStream(action: (PrintStream) -> Unit): String { val byteArrayOutputStream = ByteArrayOutputStream() val ps = PrintStream(byteArrayOutputStream) action(ps) ps.flush() return byteArrayOutputStream.toString() }


No estoy seguro de si todavía necesita una respuesta a esta pregunta, pero otros (como yo) podrían hacerlo.

Como versión 3.0, Android Studio soporta de forma nativa las funciones lambda y muchas otras funciones de Java 8 en todos los niveles de API, pero algunas (como Functional Interfaces y java.util.function ) todavía están restringidas a las API 24+.

Hasta que ese soporte se expanda, android-retrostreams proporciona soporte de backport para la mayoría de ellos. Este proyecto es un ''puerto actualizado'' de la biblioteca streamsupport , que también puede usar y tiene muchas de las funcionalidades de android-retrostreams. La biblioteca streamsupport es compatible con Java 6/7, por lo que puede usarla incluso si no tiene AS 3.0+ o no está apuntando a Java 8, pero probablemente sea mejor que use Android-retrostreams en la mayoría de los casos, si usted puede. Puede revisar los javadocs del proyecto para ver exactamente lo que se ofrece, pero los aspectos más destacados que he usado son java.util.function y java.util.Comparator .

Tenga en cuenta que java en los nombres de paquetes se reemplaza por java9 , y que algunos de los nombres de clases y / o métodos pueden haber sido cambiados ligeramente. Por ejemplo:

java.util.function convierte en java9.util.function ,

mientras

java.util.Comparator convierte en java9.util.Comparators (y con nombres de métodos y patrones de llamada ligeramente diferentes, pero con la misma funcionalidad).


allprojects { repositories { maven { url ''https://jitpack.io'' } } } dependencies { compile ''com.github.ipcjs:java-support:0.0.3'' }

código: ipcjs/java-support