Articles of lambda

android中的Lambdaexpression式

如何在android中使用lambdaexpression式? 例如,我在IntelliJ IDEA中编译此代码: package com.example.myapp; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); test s = () -> {return “Lambda expressions test”;}; AlertDialog alertDialog = new AlertDialog.Builder(this) .setTitle(“Lambda expression”) .setMessage(st()) .create(); alertDialog.show(); } } interface test { public String t(); } 但有这样的错误: Information:Using […]

运行androidConnectedTest时修复“无法desugar invokedynamic”

我的Android应用程序使用Java 8 lambdas,如下所示: myView.setOnClickListener(view -> someMethod()); 在构建应用程序或运行unit testing时,一切正常。 但是,当我运行./gradlew connectedAndroidTest ,我收到以下错误: Execution failed for task ‘:myModule:transformClassesWithDesugarForDebugAndroidTest’. Exception in thread “main” java.lang.IllegalStateException: Couldn’t desugar invokedynamic for com/…/MyActivity.onClick using java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (6) with arguments [(Landroid/view/View;)V, com/…/MyActivity.lambda$onViewBound$0(Landroid/view/View;)V (7), (Landroid/view/View;)V] at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:474) at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1623) at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1126) at org.objectweb.asm.ClassReader.accept(ClassReader.java:698) at org.objectweb.asm.ClassReader.accept(ClassReader.java:500) at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:477) at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:361) at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:314) at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:711) Caused by: […]

Kotlin,Proguard和lambdas

我有一个整洁的function,可以在视图上执行某些操作: fun Activity.withView(nr : Int, fn : T.()->Unit) { (findViewById(nr) as T?)?.fn() } 现在,当我在我的活动中使用此function时: withView(R.id.spinner_toolbar) { adapter = AdapterIndeksuDlaSpinnera(this@NewMainActivity, PlaylistIndex) ……在使用ProGuard之前一切正常。 我可以看到AdapterIndeksuDlaSpinnera被破坏,正如预期的那样,但是当使用“无法加载类AdapterIndeksuDlaSpinnera”进行编程时应用程序失败(同时它应该抱怨错误的适配器名称)。 我能够通过禁用可以在我的withView使用的所有适配器的修改来创建临时的解决方法 -keep class pl.qus.xenoamp.adapter.** { *; } 但我觉得这不是一个好的解决方案(我不知道其他类可以通过这种方式失败!)。 那么任何人都可以解释问题是什么,我应该添加什么样的ProGuard系列来潜在地修复withView使用的其他类的类似withView ?

使用gradle-retrolambda和Lightweight-Stream-API过滤Android中的对象列表

我试图在我的Android应用程序中过滤Java中的对象列表,为此我遵循了这个答案 (Java 8建议),但由于Android SDK中不支持Lambdas ,我使用了gradle-retrolambda,但我得到了这个运行时 -错误 java.lang.NoSuchMethodError: No interface method stream()Ljava/util/stream/Stream; in class Ljava/util/List; or its super classes (declaration of ‘java.util.List’ appears in /system/framework/core-libart.jar) 这是我正在使用的代码行: List closedCaseDetailsList = caseDetailsList.stream().filter(item -> item.caseClosed.equals(true)).collect(Collectors.toList()); 我相信它应该工作,因为gradle-retrolambda应该在Java7上处理Lambdas。 接下来,根据Lightweight-Stream-API的用法,我尝试了Lightweight-Stream-API以及gradle-retrolambda并稍微改变了我的代码 List closedCaseDetailsList = Stream.of(caseDetailsList).filter(item -> item.caseClosed.equals(true)).collect(Collectors.toList()); 但它给我一个错误,比Collectors.toList()说 collect (com.annimon.stream.Collector) in Stream cannot be applied to (java.util.stream.Collector<T,capture,java.util.List>) 我也试过显式地将Streamtypes转换为List但这当然没有用。 我尝试了Slack社区,SO聊天室,但找不到解决方案。 我发现问题最接近的是这个问题,但这是一个不同的错误。 谢谢

将lambda存储在kotlin中的variables中

我开始使用kotlin开发Android,我有一个lambda问题。 我有一个函数在我的视图中设置一个监听器,如下所示: fun setListener(listener: () -> Unit) { } 问题是作为lambda传递的代码不会在setListener函数中执行,它将在我的代码的另一部分执行(特别是当选择了一个微调器的项目时)所以我必须“保存”或“存储”将此lambda转换为variables/属性,以便我能够在需要时执行它。 有什么想法怎么做? 编辑:我通过以下方式实现了: private var listener: (() -> Unit)? = null fun setListener(listener: () -> Unit) { this.listener = listener } 有没有更好的方法呢? 谢谢

如何抑制匿名新的runnable()可以替换为lambda

我得到“匿名新的runnable()可以用lambda替换”警告用下面的代码。 final ScrollView sv = (ScrollView) findViewById(R.id.scrollView); sv.post(new Runnable() { @Override public void run() { sv.fullScroll(ScrollView.FOCUS_DOWN); } }); 我非常努力地在Google上搜索,似乎是使用lambdaexpression式重写… final ScrollView sv = (ScrollView) findViewById(R.id.scrollView); Runnable test = () -> sv.fullScroll(ScrollView.FOCUS_DOWN); test.run(); 但是当我尝试运行应用程序时,Android Studio会因错误而停止,如下所示: Error:(78, 40) error: lambda expressions are not supported in -source 1.7 (use -source 8 or higher to enable lambda expressions) 我无法理解为什么Android […]

lambdaexpression式未使用

在使用Android的Switch ,我附加了一个setOnCheckedChangeListener并得到了这个警告 lambdaexpression式未使用。 如果你的意思是块,你可以使用’run {…}’ 这里是代码片段: switchAction.setOnCheckedChangeListener({ _, isChecked -> { preferences.userStatus = isChecked switchToggleVisibility(isChecked) if (isChecked) { fetchStats() getOrders() } else { releaseOrder() } } }) 使用run确实可以修复此警告,但是有人知道这背后的原因吗? lambdaexpression式如何未使用?

错误:Jack需要支持java 8语言function。 启用Jack或删除sourceCompatibility JavaVersion.VERSION_1_8

正如developer.android网站中提到的那样 “根据本公告,Jack工具链已被弃用。如果您的项目依赖于Jack,您应该迁移到使用Android Studio默认工具链中内置的Java 8支持。” 我需要使用lambdaexpression式,所以我已经禁用了jack选项,但是当我编译我的代码时,我收到以下错误 Error:Jack is required to support Java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8. 下面是我的build.gradle文件的屏幕截图

无法在android min sdk版本中使用forEach和lambda小于24

我在我的android项目中使用jack编译器。 我的min sdk设置为18.我无法在代码中使用forEach和lambda。 它要求我将我的min sdk更改为24或更高。 我希望通过JACK编译器的集成,我可以很容易地将这个forEach与lambda一起使用。 除了碰撞最小的sdk之外,还有其他工作吗?

Lambda导致Android库模块中的编译器exception

当我在Android库模块中使用lambdaexpression式时,我收到编译器exceptioncom.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found 。 在Android应用程序模块中使用时,Lambdaexpression式正在编译时没有错误。 可以在此处find演示问题的示例项目: https://github.com/adamdye/AndroidLambdaIssue 示例中有趣的类是MyLibrary.java和MainActivity.java。 每个类包含相同的expression式。 建立 Android Studio 2.2 preview 1 min/target SDK version = android-N build tools version = 24.0.0.rc4 jack compiler enabled source/target compatibility = 1.8 Gradle version = 2.10 Android Plugin Version = 2.2.0-alpha1 JDK = java 8 我对使用retro-lambda不感兴趣。 我希望通过正确的配置来实现这一点。 我想我在某个地方错过了一步。