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