2016-07-27 5 views
14

я могу использовать retrolambda, чтобы позволить лямбды с уровнем Android API < 24. Так это работаетЕсть ли способ использовать функциональные интерфейсы Java 8 в Android API ниже 24?

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

Это также работает

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

Но это один не

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

последний работает на Android API Level 24, но на других устройствах этот код вызывает сбой

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

Вместо использования retrolambda я попытался включить Java 8. Первые два примера кода все еще работают, хотя маслобойник перестает работать. https://developer.android.com/preview/j8-jack.html#configuration здесь ava.util.function называется поддерживаются, но я все еще получаю сбой при запуске третьей, на этот раз это немного отличается

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

Возможный дубликат [работает ли Java 8 на Android api 23 и выше?] (Http://stackoverflow.com/questions/35934528/does-java-8-work-on-android-api-23-and- выше) –

+2

Вопрос плохо озаглавлен; lambdas на самом деле обращаются к старым версиям Android, поэтому вам не нужна Retrolambda. Просто установите новый Android Studio и создайте инструменты. –

+1

Возможно, это плохо озаглавлено. Как я понимаю, мне не нужна retorlambda, если у меня есть Android N SDK, и я разрешаю опции компиляции Jack. Лямбдас работает в любом случае. Но функциональных интерфейсов от «java.util.function» до сих пор нет. – sasha199568

ответ

7

Не уверен, что если вы все еще нужен ответ на этот вопрос, но другие (как я) может.

Как версия 3.0, Android Studio natively supports lambda functions и многие другие функции Java 8 на всех уровнях API, но некоторые (например, функциональные интерфейсы и java.util.function) по-прежнему ограничены API 24+.

До тех пор, пока эта поддержка не будет расширена, android-retrostreams обеспечивает поддержку backport для большинства из них. Этот проект является «обновленным портом» streamsupport library, который вы также можете использовать и имеет множество функций в Android-обратном направлении. Библиотека streamsupport поддерживает вплоть до Java 6/7, поэтому вы можете использовать ее, даже если у вас нет AS 3.0+ или не нацелены на Java 8, но в большинстве случаев вам, вероятно, лучше использовать андроид-ретро-потоки, если ты можешь. Вы можете пройти через javadocs проекта, чтобы посмотреть, что именно предлагается, но основные моменты, которые я использовал, - java.util.function и java.util.Comparator.

Обратите внимание: java в именах пакетов заменяется на java9, а некоторые из названий классов и/или методов могут быть изменены незначительно.Например:

java.util.function становится java9.util.function,

в то время как

java.util.Comparator становится java9.util.Comparators (и немного отличается имена методов и моделей вызовов - но те же функции).

+3

Исправление: [android-retrostreams] (https://github.com/retrostreams/android-retrostreams) * не работает на Java 7, если у вас есть Java 7 Oracle/OpenJDK VM. Он * работает * на устройствах Android до уровня API 15 или 14 независимо от версии Java, которая была тогда текущей, * предоставлена ​​* вы используете Android Studio 3.x и свои возможности Java 8 для разработки приложения для таких устройств (это не будет работа с Android Studio 2.3.x). Если вам нужен обратный порт Stream API, который действительно * работает * на реальной виртуальной машине Java 6/7 (Sun и т. Д.), Вам придется использовать [streamsupport] (https://sourceforge.net/projects/streamsupport/). – Sartorius

+0

А, мой плохой. Чтение «android-retrostreams» показало, что они только отказались от поддержки Java 6, и что он будет работать для Android Studio, даже если вы явно не нацеливались на Java 8. Однако я никогда не пытался его использовать. На всякий случай я отредактирую для уточнения. – VerumCH

+0

Какая разница, какую версию Java вы планируете использовать в Android Studio 3.x? В конце концов, это * minSDKVersion *, который решает, работает ли ваше приложение, скажем, Marshmallow. Поэтому, чтобы избежать возможной путаницы: пусть * minSDKVersion = 23 * (Marshmallow), затем «нацеливает» Java 8 в Android Studio 3.x и использует «android-retrostreams», и с вами все будет в порядке. Я говорю о том, что файл 'android-retrostreams' ** jar ** не может быть запущен на виртуальной машине Java 7 Standard Edition (JRE из Oracle, IBM ...) – Sartorius

-1

Java 8 функциональных интерфейсы могут быть включены, чтобы работать на более ранние версии Android по позволяя Jack Toolchain. Вы можете сделать это, добавив следующие строки кода в файл build.gradle:

android{ 
... 
    defaultConfig{ 
    ... 
    jackOptions.enabled = true 
    } 
    compileOptions{ 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
    } 
} 

Однако вы должны отметить, что вам нужно отключить мгновенный запуск, поскольку он до сих пор не может работать с Java 8.

Вы также можете узнать больше информации из этого видео от андроида каналу разработчиков: https://www.youtube.com/watch?v=zfLKMun94Yc&index=10&list=PLWz5rJ2EKKc9tH0dRV1_HmQBXe_-qFQPl

Позвольте мне знать, как она идет.

+3

Несомненно, это так. Однако, чтобы избежать ошибочного представления, следует, наверное, упомянуть, что функциональные интерфейсы из пакета 'java.util.function' по-прежнему будут недоступны. – Sartorius

+0

Android поддерживает лямбда, даже если API ниже, чем у iOS, однако это не работает для функционального интерфейса. – York

+0

Jack toolchain теперь [устарел] (https://developer.android.com/studio/preview/features/java8-support .html) – nyconing

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

код: ipcjs/java-support

+2

что это и почему это помогает? – lucidbrot

+0

@lucidbrot, чтобы увидеть README.md в [resp] (https://github.com/ipcjs/java-support) – ipcjs

+1

@jpcjs Да, я уже посмотрел на это, но это не так много документации. Мой вопрос остается ^^ что это? просто полная копия андроида? и почему это работает? – lucidbrot