标签: retrolambda

Google App Engine上的Retrolambda

是否有人使用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

5
推荐指数
1
解决办法
176
查看次数

Android应用程序+ Java模块(Java 1.8)

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表达式,但我需要它.

我只看到下一个解决方案:

  1. 使网络模块不是java而是android-module并使用retrolambda(但是我要从这个模块中生成.jar而不是.aar所以它必须是java)

  2. 不要在我的java模块中使用lambda表达式(以后的.jar)(但我想使用它,因为rxJava中没有lambda的愚蠢代码太匹配了)

对我来说最好的解决方案就是在我的java模块中使用retrolambda.我试过做类似的事情,但retroambda依赖(apply plugin:'me.tatarka.retrolambda')在编译期间没有受到影响.或者也许使用java 1.7与retrolambda之类的东西.但gradle文件没有部分android {...}来设置compileOptions.

这该怎么做?

java lambda android gradle retrolambda

5
推荐指数
1
解决办法
1663
查看次数

找不到Retrolambda $ Lambda

我正在与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)

lambda android retrolambda

5
推荐指数
0
解决办法
242
查看次数

从 rx java 表达式转换为 lambda

我已经开始研究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)

android rx-java retrolambda

4
推荐指数
1
解决办法
2814
查看次数

Retrolambda错误:无法在null对象上获取属性'destinationDir'

我试图在我的应用程序中使用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 retrolambda

4
推荐指数
1
解决办法
3828
查看次数

使用lambda表达式创建AlertDialog

我的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?

lambda android java-8 android-alertdialog retrolambda

3
推荐指数
1
解决办法
2313
查看次数

Lambda 表达式 - 不能将 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(登录)
请帮助我理解这个表达有什么问题。

java lambda android retrolambda

3
推荐指数
1
解决办法
1万
查看次数

改进2.0 xml simplexml转换器问题,同时在gradle文件中具有retrolambda

这是我的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)

retrofit retrolambda

3
推荐指数
1
解决办法
3245
查看次数

Lint 在读取 Kotlin 对象的 Java 类上崩溃

我有一个 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)

android lint lombok kotlin retrolambda

3
推荐指数
1
解决办法
245
查看次数

Android:接口中使用静态方法的NoSuchMethodError(使用Retrolambda)

在我的项目中,我尝试使用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开始......

如果需要,我可以提供更多代码,但我认为一切都很重要.在此先感谢您的帮助.

java android retrolambda

2
推荐指数
1
解决办法
1239
查看次数

任务执行失败':app:compileRetrolambdaDebug'

我使用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)

java android gradle retrolambda

2
推荐指数
1
解决办法
3030
查看次数

找不到封闭方法'void lambda $ getTestFlowable $ 0(io.reactivex.FlowableEmitter)'

我在我的项目中使用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

现在,我看到两个临时解决方案来解决这个问题:

  1. 不要使用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)
  2. 禁用类上的proguard,其中包含上面列出的方法

但我仍然想知道为什么会这样?这是RxJava2\Retrolambda\Proguard中的错误吗?

java android proguard retrolambda rx-java2

1
推荐指数
1
解决办法
1013
查看次数

Retrolambda有什么用?

Retrolambda有什么用?
我们在哪里使用Retrolambda框架?

java android retrolambda

-1
推荐指数
1
解决办法
2831
查看次数