migrate from jack to native Java 8

I'm trying to use lambda expressions and streams in my Android project.I'm using streamsupport library for streams, and native Java 8 for lambda expressions. To be able to use Java 8 features I need to add

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

this code in my gradle, but the compiler shows this error:

Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.

and then I added this

jackOptions {
    enabled true
}

and there was no error by the compiler, but on runtime the same error keeps showing. This is my gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"

    defaultConfig {
        applicationId "home.gio.calorieplanner"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', 
    {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:recyclerview-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'org.greenrobot:eventbus:3.0.0'
    compile 'com.android.support:design:25.3.1'
    compile 'com.google.firebase:firebase-crash:10.0.1'
    compile 'com.google.code.gson:gson:2.8.0'
    compile 'com.google.firebase:firebase-database:10.2.4'
    compile 'com.google.firebase:firebase-core:10.2.4'
    compile 'com.jakewharton:butterknife:8.5.1'
    compile 'com.firebaseui:firebase-ui-database:1.1.0'
    compile 'org.jsoup:jsoup:1.10.2'
    compile 'com.android.support:percent:25.3.1'
    compile 'com.thoughtbot:expandablecheckrecyclerview:1.4'
    testCompile 'junit:junit:4.12'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
    compile 'net.sourceforge.streamsupport:streamsupport:1.5.4'
}



apply plugin: 'com.google.gms.google-services'

and this is the method where I'm using lambda expressions and streams.

public String identifySubMenu(String group, int index) {
    List<Product> prod = StreamSupport
            .stream(Main.outRetailChainList.get(Constants.GOODWILL).getProducts())
            .filter(item -> item.getCategory().equals(group))
            .collect(Collectors.toList());
    return prod.get(index).getSubMenu();
}

So my question is how can I fix this error.


You have many options :

1 - upgrade your version of android studio to 3.0 this versions don't need jack anymore and lambda are now correctly handled, but this version is in canary channel, that is their "beta" one.

2 - don't use lambda now and wait 3.0 to be released as jack don't handle lambda fully correctly. You got a fully explained page on this : https://developer.android.com/guide/platform/j8-jack.html

3 - use a plugin named retrolambda, but this increase your compilation time. To my mind, this option is way too heavy just for lambda

链接地址: http://www.djcxy.com/p/96324.html

上一篇: 将ValueTuple转换为IEnumerable

下一篇: 从jack迁移到本地Java 8