是否有人使用Retrolambda进行Google App Engine项目?你的pom.xml是什么样的?
编译JDK8并设置retrolambda的maven插件非常简单.但是,为了部署到GAE,Google的appengine-maven-plugin需要在JDK7下运行,否则它会将JSP文件编译成一种在生产中断的格式.
我如何使用JDK8 + retrolambda进行编译,但JDK7用于appengine:update?
google-app-engine maven-3 maven appengine-maven-plugin retrolambda
Android Project(gradle)有主要的应用程序模块: app - android应用程序(apply plugin:'com.android.application')和java-module: network - (apply plugin:'java')
java模块网络默认具有源代码兼容性1.8,因为lambda表达式,我真的想拥有它.
但默认情况下Android应用程序1.7我无法构建应用程序.当然我在我的app - android模块中使用了retrolambda ,但项目因为以下原因而无法编译:
Error:com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
Run Code Online (Sandbox Code Playgroud)
如果我创建我的java模块,一切都编译好:
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
Run Code Online (Sandbox Code Playgroud)
但在这种情况下我不能使用lambda表达式,但我需要它.
我只看到下一个解决方案:
使网络模块不是java而是android-module并使用retrolambda(但是我要从这个模块中生成.jar而不是.aar所以它必须是java)
不要在我的java模块中使用lambda表达式(以后的.jar)(但我想使用它,因为rxJava中没有lambda的愚蠢代码太匹配了)
对我来说最好的解决方案就是在我的java模块中使用retrolambda.我试过做类似的事情,但retroambda依赖(apply plugin:'me.tatarka.retrolambda')在编译期间没有受到影响.或者也许使用java 1.7与retrolambda之类的东西.但gradle文件没有部分android {...}来设置compileOptions.
这该怎么做?
我正在与Android做一些工作,并想用它来测试Retrolambda.但不幸的是我遇到了一个问题.
我有一个Dialog类,它将Consumer作为参数:
public class AuthDialog extends Dialog {
public static final String SERVER_URL = "http://cohhgas.ddns.net/auth";
private Consumer<UserCredentials> onSuccess;
public AuthDialog(Context context, Consumer<UserCredentials> onSuccess) {
super(context);
this.onSuccess = onSuccess;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个使用它的活动:
public class MainActivity extends AppCompatActivity {
public static final String CREDENTIALS = "sharedPrefsCredentials";
GiveAway giveAway;
SharedPreferences sharedpreferences;
public MainActivity() {
EventBus.getDefault().register(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AuthDialog auth_dialog;
auth_dialog = new AuthDialog(MainActivity.this, userCredentials -> Log.d("cool", "works"));
auth_dialog.show();
TextView textView = new TextView(MainActivity.this);
textView.setOnClickListener((view) -> …Run Code Online (Sandbox Code Playgroud) 我已经开始研究retrolambda 和rxjava。我自己转换了一些表达式,但其中一些我无法转换。我已将 retrolambda 添加到我的项目中。这里是示例
public Observable<ImmutableList<Repository>> getUsersRepositories() {
return githubApiService.getUsersRepositories(user.login)
.map(repositoryResponses -> {
final ImmutableList.Builder<Repository> listBuilder = ImmutableList.builder();
for (RepositoryResponse repositoryResponse : repositoryResponses) {
Repository repository = new Repository();
repository.id = repositoryResponse.id;
repository.name = repositoryResponse.name;
repository.url = repositoryResponse.url;
listBuilder.add(repository);
}
return listBuilder.build();
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何转换这种代码的和平:
obs.subscribe(new Observer<List<Integer>>() {
public void onCompleted() {
System.out.println("completed");
}
public void onError(Throwable e) {
System.out.println("failure");
}
public void onNext(List<Integer> value) {
System.out.println("onnext=" + value);
}
});
Run Code Online (Sandbox Code Playgroud) 我试图在我的应用程序中使用retrolambda,但我遇到问题
build.gradle项目
buildscript {
repositories {
jcenter()
mavenLocal()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
mavenLocal()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)
build.gradle app
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 23
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "psystem.co.reaya"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName …Run Code Online (Sandbox Code Playgroud) 我的Android工作室设置如下:
classpath "me.tatarka:gradle-retrolambda:3.2.2"
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用lambdas知道我能做什么或不做什么.
当我做以下代码时:
alertDialogBuilder.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
Run Code Online (Sandbox Code Playgroud)
IDE变灰了,new DialogInterface.OnClickListener()告诉我它可以用lambda替换.没有更多或更少.看了几个 例子.我尝试过这样的事情:
alertDialogBuilder.setPositiveButton("Okay", (DialogInterface dialog) -> {
dialog.cancel();
});
Run Code Online (Sandbox Code Playgroud)
还有这些:
alertDialogBuilder.setNegativeButton((DialogInterface) d -> d.cancel());
Run Code Online (Sandbox Code Playgroud)
其中的错误:
错误:(99,64)错误:不兼容的类型:DialogInterface不是功能接口在接口DialogInterface中找到的多个非重写抽象方法
在这种情况下我应该如何使用lambda?
我正在尝试使用retrolambda在 Android 上使用 lambda 表达式。在下面的代码中,我需要添加作为接口的侦听器:
public interface LoginUserInterface {
void onLoginSuccess(LoginResponseEntity login);
void onLoginFail(ServerResponse sr);
}
Run Code Online (Sandbox Code Playgroud)
代码
private void makeLoginRequest(LoginRequestEntity loginRequestEntity) {
new LoginUserService(loginRequestEntity)
.setListener(
login -> loginSuccess(login),
sr -> loginFail(sr))
.execute();
}
private void loginSuccess(LoginResponseEntity login) {
//TODO loginSuccess
}
private void loginFail(ServerResponse sr) {
//TODO loginFail
}
Run Code Online (Sandbox Code Playgroud)
但是 Android Studio 将红色loginSuccess( login )和loginFail( sr )标记为错误并显示消息“无法应用 LoginResponseEntity ”和“无法应用 ServerResponse ”
所以我无法将 lambda 参数“ login ”设置为方法loginSuccess(登录)。
请帮助我理解这个表达有什么问题。
这是我的gradle文件
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.demo.sample"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
//Retrofit
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
//Retrofit support libraries
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
//compile 'com.squareup.retrofit2:converter-simplexml:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
//RxAndroid
compile 'io.reactivex:rxandroid:1.1.0'
//Explicit support for latest RxJava …Run Code Online (Sandbox Code Playgroud) 我有一个 Kotlin 数据类:
data class InterviewCreation(
val candidateId: String,
val offerId: String,
val startingDateTime: Long,
val duration: Long,
val location: String,
val description: String?
)
Run Code Online (Sandbox Code Playgroud)
和一个像这样开始的 Mapper 类(在 Java 中):
public InterviewCreationViewModel toViewModel(InterviewCreation newInterview, String candidateName, String candidatePhotoUrl) {
String description = newInterview.getDescription();
String location = newInterview.getLocation();
long duration = newInterview.getDuration();
...
}
Run Code Online (Sandbox Code Playgroud)
运行 Lint 时,它在 Mapper 类中崩溃
ECJ compiler crashed processing .../InterviewCreationViewModelMapper.java
java.lang.NullPointerException
at org.eclipse.jdt.internal.compiler.ast.MessageSend.analyseCode(MessageSend.java:138)
at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.analyseCode(LocalDeclaration.java:89)
at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.analyseCode(MethodDeclaration.java:125)
at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.internalAnalyseCode(TypeDeclaration.java:739)
at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.analyseCode(TypeDeclaration.java:263)
at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.analyseCode(CompilationUnitDeclaration.java:118)
at com.android.tools.lint.EcjParser$NonGeneratingCompiler.process(EcjParser.java:1521)
at org.eclipse.jdt.internal.compiler.Compiler.processCompiledUnits(Compiler.java:550) …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我尝试使用Retrolambda插件和Lightweight-Stream-API在Android应用程序中使用Java 8编写的代码来绕过代码兼容性.源项目在Java平台上运行良好(澄清).
在将代码移植到Android之后,我只需对代码进行一些修改(主要是关于获取com.annimon.stream.Stream类的实例,因为Android中的数组和集合缺少方法,.stream()所以我需要使用Stream类的静态方法,将array/collection作为参数),但这甚至不应该成为我问题的关注点.目前没有编译错误,应用程序启动,工作,但在调用时崩溃:
Optional<Room> result = INamed.getO(name, Stream.of(rooms));
Run Code Online (Sandbox Code Playgroud)
出错:
FATAL EXCEPTION: main
Process: cz.alois_seckar.vseadventrura, PID: 8109
java.lang.NoSuchMethodError: No static method getO(Ljava/lang/String;Lcom/annimon/stream/Stream;)Lcom/annimon/stream/Optional; in class Lcz/alois_seckar/vseadventrura/eu/pedu/adv16s_fw/game_txt/INamed; or its super classes (declaration of 'cz.alois_seckar.vseadventrura.eu.pedu.adv16s_fw.game_txt.INamed' appears in /data/data/cz.alois_seckar.vseadventrura/files/instant-run/dex/slice-slice_1-classes.dex)
at cz.alois_seckar.vseadventrura.eu.pedu.adv16s_fw.test_util.default_game_txt.game.Apartment.getORoom(Apartment.java:166)
at cz.alois_seckar.vseadventrura.eu.pedu.adv16s_fw.test_util.default_game_txt.game.Room$$Lambda$1.apply(Unknown Source)
at com.annimon.stream.Stream$12.nextIteration(Stream.java:539)
...
Run Code Online (Sandbox Code Playgroud)
和类Room实现INamed通过它的祖先(Room延伸AItemContainer扩展ANamed实现INamed).
所以我真的不明白,问题是什么.我怀疑Retrolambda插件与 Java 8没有完全相同,但无法告诉要改变什么以及如何......问题可能完全在其他地方,我只是从Android开始......
如果需要,我可以提供更多代码,但我认为一切都很重要.在此先感谢您的帮助.
我使用retrolambda很长一段时间,但突然他停止了我的所有项目.我重新安装了jdk,但它没有帮助.我没有在谷歌找到答案,我希望你能帮助我.我的gradle文件:build.gradle(app):
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 25
buildToolsVersion "25.0.1"
defaultConfig {
applicationId "xsystem.ru.test"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.1.0'
}
Run Code Online (Sandbox Code Playgroud)
build.gradle(Project):
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3' …Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用RxJava2和Retrolambda,并且有一段时间我觉得非常好,将回调包装成flowables,但有一天我遇到了这个错误,如果我尝试在这个非常简化的代码片段上运行proguard:
private Flowable<Object> getTestFlowable() {
return Flowable.create(emitter -> new Thread(new Runnable() {
@Override
public void run() {
emitter.onNext("one");
emitter.onComplete();
}
}).run(), BackpressureStrategy.BUFFER);
}
Run Code Online (Sandbox Code Playgroud)
然后我会得到这个警告,这使我的构建失败:警告:com.yandex.testfield.MainActivity $ 1:在程序类com.yandex中找不到封闭方法'void lambda $ getTestFlowable $ 0(io.reactivex.FlowableEmitter)'. testfield.MainActivity
现在,我看到两个临时解决方案来解决这个问题:
不要使用lambda而是使用匿名类
private Flowable<Object> getTestFlowable() {
return Flowable.create(new FlowableOnSubscribe<Object>() {
@Override
public void subscribe(FlowableEmitter<Object> emitter) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
emitter.onNext("one");
emitter.onComplete();
}
}).run();
}
}, BackpressureStrategy.BUFFER);
}
Run Code Online (Sandbox Code Playgroud)但我仍然想知道为什么会这样?这是RxJava2\Retrolambda\Proguard中的错误吗?
Retrolambda有什么用?
我们在哪里使用Retrolambda框架?