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
:
- androidx.core.util.Consumer (aparece en
androidx.appcompat:appcompat:1.0.2
) - androidx.core.util.Supplier (aparece en
androidx.appcompat:appcompat:1.1.0-alpha01
)
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